iOS 的視圖階層、繼承關係及常用結構體探討

來源:互聯網
上載者:User

標籤:總結   lease   示範   管理   key   傳回值   nsstring   繪圖   pos   

UIView表示螢幕上的一塊矩形地區,它在App中佔有絕對重要的地位,因為IOS中幾乎所有可視化控制項都是UIView的子類。負責渲染地區的內容,並且響應該地區內發生的觸摸事件

 

 

UIView的功能 1.管理矩形地區裡的內容2.處理矩形地區中的事件3.子視圖的管理 4.還能實現動畫  UIView的子類也具有這些功能

 

就是視圖的內層次

                                        

1)三個結構體 CGPoint、CGSize、CGRect

 

1.  CGPoint struct CGPoint {    CGFloat x;    CGFloat y;  };   typedef struct CGPoint CGPoint;  看到這個想必你已經懂了,不再解釋。 2.CGSize struct CGSize {    CGFloat width;    CGFloat height;  };   typedef struct CGSize CGSize;  不解釋。 3.CGRect struct CGRect {    CGPoint origin;  //位移是相對父視圖的    CGSize size;  };  typedef struct CGRect CGRect;  同樣 不解釋。 這三個結構體均在一個標頭檔裡:CGGeometry.h

 

 

2)視圖的最基本屬性

frame和center都是相對於父視圖的,bounds是相對於自身的

 

frame   是CGRect  frame的origin是相對於父視圖的左上方原點(0,0)的位置,改變視圖的frame會改變center

center  是CGPoint  指的就是整個視圖的中心點,改變視圖的center也會改變frame

bounds 是CGRect  是告訴子視圖本視圖的原點位置(通俗的說就是,子視圖的frame的origin與父視圖的bounds的origin的差,就是子視圖相對於父視圖左上方的位置,如果結果為負,則子視圖在父視圖外)

通過addSubview:這個方法添加子類,不管誰添加它,只要越晚添加,視圖就在越上層

移除父視圖也會把它得子視圖移除

 

3)幾個基本介面元素:window(視窗)、視圖(view)

 

1.UIView 下面來認識一下UIView類,這個類繼承自UIResponder,看這個名字我們就知道它是負責顯示的畫布,如果說把window比作畫框的話。我們就是不斷地在畫框上移除、更換或者疊加畫布,或者在畫布上疊加其他畫布,大小當然 由繪畫者來決定了。有了畫布,我們就可以在上面任意施為了。很多簡單的東西我會把庫裡面的內容貼出來,如果東西太多貼出來就不太好,朋友們自己去庫檔案裡面看吧。這個類在UIView.h裡面。下面我們先學習一些基礎的東西,其他的東東會在以後慢慢展開。 UIView* myView =[[ UIView alloc]initWithFrame:CGRectMake(0.0,0.0,200.0,400.0)];     //這裡建立了一塊畫布,定義了相對於父視窗的位置, 以及大小。   我們可以把這塊畫布加到其他畫布上,具體方法後面會講到。我們還可以在這塊畫布上畫上其它好玩的東東,具體情形後面會一一講解。   2.UIWindow UIWindow繼承自UIView,關於這一點可能有點邏輯障礙,畫框怎麼繼承自畫布呢?不要過於去專牛角尖,畫框的形狀不就是跟畫布一樣嗎?拿一塊畫布然後用一些方法把它加強,是不是可以當一個畫框用呢?這也是為什麼 一個view可以直接加到另一個view上去的原因了。看一下系統的初始化過程(在application didFinishLauchingWithOptions裡面): self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  self.window.backgroundColor = [UIColor grayColor];       //給window設定一個背景色   [self.window makeKeyAndVisible];     //讓window顯示出來    

3.UIScreen類代表了螢幕,通過這個類我們可以擷取一些想要的東東

 

CGRect screenBounds = [ [UIScreen mainScreen]bounds];    //返回的是帶有狀態列的Rect CGRect viewBounds = [ [UIScreen mainScreen]applicationFrame];    //不包含狀態列的Rect   //screenBounds 與 viewBounds 均是相對於裝置螢幕來說的  //所以 screenBounds.origin.x== 0.0 ;   screenBounds.oringin.y = 0.0;     screenBounds.size.width == 320;  screenBounds.size.height == 480(或者其他解析度有所差異)  //所以 screenBounds.origin.x== 0.0 ;   screenBounds.oringin.y = 20.0;(因為狀態列的高度是20像素)   screenBounds.size.width == 320;  screenBounds.size.height == 480  //取得StatusBar的位置和大小  [self.view addSubview:theToolbar];  CGRect statusBarRect = [[UIApplication sharedApplication]statusBarFrame];    NSLog(@\"%@\", NSStringFromCGRect(statusBarRect)); 

 

4.實戰演練

 

 

 沒結束我會用一個綜合的 例子來總結我的學習成果,徹底理解所學,我覺得既然選擇寫代碼,就要理解原理,否則只知其然不知其所以然是不能做一個好的程式員的。建立一個工程選擇Empty Application   名字為LW1?2)在application didFinishLaunchingWithOptions裡面,你會發現系統已經建好一個畫框了,我們現在就用系統幫我們建好的畫框,你當然也可以自己建一個畫框,不過沒這個必要了,忘了講了,一個應用程式只能有一個畫框。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  {       self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];//系統幫你建畫框             //自己測試一下 bounds與aplicationFrame的區別      CGRect bound = [[UIScreen mainScreen]bounds];      NSLog(@"boundwidth:%f    boundheight:%f ",bound.size.width, bound.size.height);      NSLog(@"boundx:%f    boundy:%f ",bound.origin.x, bound.origin.y);            CGRect appBound = [[UIScreen mainScreen]applicationFrame];      NSLog(@"appBoundwidth:%f appBoundheight:%f "             ,appBound.size.width,appBound.size.height);      NSLog(@"appBoundx:%f    appBoundy:%f ",appBound.origin.x, appBound.origin.y);        //畫第一塊畫布然塗成藍色,大小是320 X 100      CGRect CGone = CGRectMake(0.0, 0.0, 320, 100);//畫個矩形,初始化位置與大小       UIView *v_one = [[UIView alloc]initWithFrame:CGone];//初始化view       v_one.backgroundColor = [UIColor blueColor];// 塗成藍色       [self.window addSubview:v_one];//直接加到畫框上             //第二塊注意它的位置      CGRect CGtwo = CGRectMake(0.0, 100, 160, 100);//畫個矩形、初始化位置與大小       UIView *v_two = [[UIView alloc]initWithFrame:CGtwo];//初始化view      v_two.backgroundColor = [UIColor redColor];//塗成紅色       [self.window addSubview:v_two];//疊加到畫框       //第三塊注意他的位置      CGRect CGthree = CGRectMake(160, 100, 160, 100);    UIView *v_three = [[UIView alloc]initWithFrame:CGthree];    v_three.backgroundColor = [UIColor greenColor];    [self.window addSubview:v_three];     //第四塊注意它的位置      CGRect CGfour = CGRectMake(0.0, 260, 320, 200);    UIView *v_four = [[UIView alloc]initWithFrame:CGfour];    v_four.backgroundColor = [UIColor orangeColor];             [self.window addSubview:v_four];//     //第五塊,計算一下它的位置,看看它的效果,      //你可以讓試一下把這段代碼移到第一快初始化的上面試試,會有意想不到的效果      CGRect CGfive = CGRectMake(100, 150, 160, 200);      UIView *v_five = [[UIView alloc]initWithFrame:CGfive];      v_five.backgroundColor = [UIColor yellowColor];      [self.window addSubview:v_five];      self.window.backgroundColor = [UIColor grayColor];    [self.window makeKeyAndVisible];     //最後記得release     [v_one  release];     [v_two  release];     [v_three  release];     [v_four  release];     [v_five  release];      return YES;  }   4)UIView的方法 一個 UIView 裡面可以包含許多的 Subview(其他的 UIView),而這些 Subview 彼此之間是有所謂的階層關係,這有點類似繪圖軟體中圖層的概念,下面程式碼示示範了幾個在管理圖層(Subview)上常用的方法,其程式碼如下。 1.首先是大家最常使用的新增和移除Subview。 ?[Subview removeFromSuperview];     //將Subview從當前的UIView中移除 [UIView addSubview:Subview];     //替UIView增加一個Subview   2.在UIView中將Subview往前或是往後移動一個圖層,往前移動會覆蓋住較後層的 Subview,而往後移動則會被較上層的Subview所覆蓋。 ?[UIView bringSubviewToFront:Subview];       //將Subview往前移動一個圖層(與它的前一個圖層對調位置)//將Subview往前移動一個圖層(與它的前一個圖層對調位置)[UIView sendSubviewToBack:Subview];      //將Subview往後移動一個圖層(與它的後一個圖層對調位置)  3.在UIView中使用索引Index交換兩的Subview彼此的圖層層級。 [UIView exchangeSubviewAtIndex:indexA withSubviewAtIndex:indexB];    //交換兩個圖層   4.使用Subview的變數名稱取得它在UIView中的索引值(Index )。?NSInteger index = [[UIView subviews] indexOfObject:Subview名稱];       //取得Index   5.替Subview加上NSInteger 的註記(Tag)好讓之後它們分辨彼此。  ?[Subview setTag:NSInteger];       //加上標記[UIView viewWithTag:NSInteger];  //通過標記得到view 傳回值為UIView 6.最後是取得UIView中所有的Subview,呼叫此方法會傳回一個 NSArray,並以由後往前的順序列出這些 Subview,中是列出範例圖片裡Root中所有的Subview。 ?[UIView subviews] ;        //取的UIView下的所有Subview  文章原文地址:http://blog.csdn.net/xingboss3/article/details/7890238

iOS 的視圖階層、繼承關係及常用結構體探討

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.