1、概念
UIView表示 屏幕上的一塊矩形區(qū)域,它在app占有絕對重要的地位,因為ios中幾乎所有可視化控件都是UIView的子類,負責渲染區(qū)域內(nèi)的內(nèi)容, 并且響應該區(qū)域內(nèi)發(fā)生的觸摸事件
2、功能
(1)管理矩形區(qū)域內(nèi)的內(nèi)容
(2)處理矩形區(qū)域中的事件
(3)子視圖的管理
(4)還能實現(xiàn)動畫(UIView的子類也具有這些功能)
3、視圖的內(nèi)層次
4、三個結(jié)構體(CGPoint、CGSize、CGRect),三個結(jié)構體均在一個頭文件里:CGGeometry.h
(1)CGPoint
struct CGPoint
? ?{
CGFloat x;
CGFloat y;
}
typedef struct CGPoint CGPoint;
(2)CGSize
struct CGSize
{
CGFloat width;
CGFloat height;
}
(3)CGRect
struct CGRect
{
CGPoint origin;
CGSize size;
}
5、視圖的最基本屬性
(1)frame和center都是相對于父視圖的,bounds是相對于自身的
frame? 是CGRect? frame的origin是相對于父視圖的左上角原點(0,0)的位置,改變視圖的frame會改變center
(2)center? 是CGPoint? 指的就是整個視圖的中心點,改變視圖的center也會改變frame
bounds 是CGRect? 是告訴子視圖本視圖的原點位置(通俗的說就是,子視圖的frame的origin與父視圖的bounds的origin的差,就是子視圖相對于父視圖左上角的位置,如果結(jié)果為負,則子視圖在父視圖外)
通過addSubview:這個方法添加子類,不管誰添加它,只要越晚添加,視圖就在越上層
移除父視圖也會把它得子視圖移除
frame和bounds是UIView中的兩個屬性(property)。
frame指的是:該view在父view坐標系統(tǒng)中的位置和大小。(參照點是父親的坐標系統(tǒng))
bounds指的是:該view在本身坐標系統(tǒng)中 的位置和大小。(參照點是本身坐標系統(tǒng))
-(CGRect)frame{
returnCGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
returnCGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}
6、幾個基本界面元素:window(窗口)、視圖(view)
1)UIView
下面來認識一下UIView類,這個類繼承自UIResponder,看這個名字我們就知道它是負責顯示的畫布,如果說把window比作畫框的話。我們就是不斷地在畫框上移除、更換或者疊加畫布,或者在畫布上疊加其他畫布,大小當然 由繪畫者來決定了。有了畫布,我們就可以在上面任意施為了。很多簡單的東西我會把庫里面的內(nèi)容貼出來,如果東西太多貼出來就不太好,朋友們自己去庫文件里面看吧。這個類在UIView.h里面。下面我們先學習一些基礎的東西,其他的東東會在以后慢慢展開。
UIView* myView =[[ UIView alloc]initWithFrame:CGRectMake(0.0,0.0,200.0,400.0)];//這里創(chuàng)建了一塊畫布,定義了相對于父窗口的位置, 以及大小。
2)UIWindow
UIWindow繼承自UIView,關于這一點可能有點邏輯障礙,畫框怎么繼承自畫布呢?不要過于去專牛角尖,畫框的形狀不就是跟畫布一樣嗎?拿一塊畫布然后用一些方法把它加強,是不是可以當一個畫框用呢?這也是為什么 一個view可以直接加到另一個view上去的原因了。
看一下系統(tǒng)的初始化過程(在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];//返回的是帶有狀態(tài)欄的Rect
CGRect viewBounds = [ [UIScreen mainScreen]applicationFrame];//不包含狀態(tài)欄的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;(因為狀態(tài)欄的高度是20像素)screenBounds.size.width == 320; ?screenBounds.size.height == 480
//取得StatusBar的位置和大小
[self.view addSubview:theToolbar];
CGRect statusBarRect = [[UIApplication sharedApplication]statusBarFrame];
NSLog(@\"%@\", NSStringFromCGRect(statusBarRect));
7、實戰(zhàn)演練
沒結(jié)束我會用一個綜合的 例子來總結(jié)我的學習成果,徹底理解所學,我覺得既然選擇寫代碼,就要理解原理,否則只知其然不知其所以然是不能做一個好的程序員的。
新建一個工程選擇Empty Application ? 名字為LW12)在application didFinishLaunchingWithOptions里面,你會發(fā)現(xiàn)系統(tǒng)已經(jīng)建好一個畫框了,我們現(xiàn)在就用系統(tǒng)幫我們建好的畫框,你當然也可以自己建一個畫框,不過沒這個必要了,忘了講了,一個應用程序只能有一個畫框。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];//系統(tǒng)幫你建畫框
//自己測試一下 bounds與aplicationFrame的區(qū)別
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往前移動一個圖層(與它的前一個圖層對調(diào)位置)//將Subview往前移動一個圖層(與它的前一個圖層對調(diào)位置)
[UIView sendSubviewToBack:Subview];//將Subview往后移動一個圖層(與它的后一個圖層對調(diào)位置)
3.在UIView中使用索引Index交換兩的Subview彼此的圖層層級。
[UIView exchangeSubviewAtIndex:indexA withSubviewAtIndex:indexB];//交換兩個圖層
4.使用Subview的變數(shù)名稱取得它在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
、