視圖是用戶在屏幕上所看到的,也是用戶通過(guò)觸摸屏幕進(jìn)行交互的東西,因此視圖是一個(gè)應(yīng)用可視化 可觸摸表現(xiàn)的主要組成部分。
1.1 子視圖和父視圖
UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 150, 200, 200)];v1.backgroundColor = [UIColor redColor];UIView *v2 = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 80, 80)];v2.backgroundColor = [UIColor greenColor];UIView *V3 = [[UIView alloc] initWithFrame:CGRectMake(70, 70, 80, 80)];V3.backgroundColor = [UIColor blackColor]; [self.view addSubview:v1];[v1 addSubview:v2];[v1 addSubview:V3];
上面的代碼創(chuàng)建了視圖 v1 v2 v3,v2 v3是v1的子視圖 。
視圖在視圖的層次結(jié)構(gòu)的位置并不影響它是如何繪制的,但是會(huì)影響繪制的順序,上面的例子可以體現(xiàn)出來(lái)
不同層級(jí)時(shí):父視圖先繪制
相同層級(jí)時(shí):“更早”加入的視圖先繪制
視圖層次結(jié)構(gòu)的其他效果:
如果視圖從它的父視圖移除或移入,它的子視圖將會(huì)和它一起
如果視圖的尺寸改變,它的子視圖能夠自動(dòng)重新調(diào)整尺寸
視圖的透明度將會(huì)被子視圖繼承
視圖可以選擇性的限制它的子視圖的繪制,這樣任何視圖之外的部分都不會(huì)顯示,這稱為剪切,并且是通過(guò)設(shè)置視圖的clipsToBounds屬性進(jìn)行控制的。
父視圖擁有他們的子視圖,從內(nèi)存管理的角度來(lái)看,和NSArray擁有他們的元素很像,它保留它們并負(fù)責(zé)當(dāng)該子視圖不再是它的子視圖的時(shí)候(從這個(gè)視圖的子視圖集合移除)或者不再存在時(shí)釋放它們。
UIView有一個(gè)superview屬性(一個(gè)UIView)和subviews屬性(一個(gè)由UIView組成的NSArray)。
1.2 應(yīng)用程序窗口
視圖的頂層是窗口UIWindow(UIView的子類),一個(gè)應(yīng)用至少有一個(gè)UIWindow的實(shí)例,該實(shí)例占據(jù)整個(gè)屏幕,是其他所有可見(jiàn)視圖的最終父視圖。
應(yīng)用創(chuàng)建窗口有三種方法:
第一種是不使用xib和串聯(lián)圖,用代碼創(chuàng)建,代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; [self.window makeKeyAndVisible]; return YES;}
application:didFinishLaunchingWithOptions:是應(yīng)用程序委托的一個(gè)方法,應(yīng)用完成啟動(dòng)的時(shí)候會(huì)調(diào)用這個(gè)方法,UIWindow實(shí)例必須在應(yīng)用的整個(gè)生命周期中存在,所以委托中有個(gè)一window保留它,makeKeyAndVisible消息用以顯示應(yīng)用界面.
第二種是使用串聯(lián)圖:
這種辦法不需要寫任何代碼,我現(xiàn)在xcode的版本是6.0,創(chuàng)建項(xiàng)目選擇single view會(huì)自動(dòng)創(chuàng)建一個(gè)串聯(lián)圖(.storyboard文件),在Info.plist文件中的“Main storyboard file base name”指定即可,默認(rèn)已經(jīng)指定了,當(dāng)然也可以自己創(chuàng)建一個(gè)storyboard文件重新指定。
在這種情況下,UIApplicationMain實(shí)例化應(yīng)用程序委托后,它會(huì)請(qǐng)求委托的window屬性,如果為nil,UIApplicationMain將會(huì)創(chuàng)建一個(gè)UIWindow實(shí)例并賦值給委托的window屬性,串聯(lián)圖的initial view controller(初始視圖控制器)實(shí)例化并賦值給window的rootViewController屬性,隨后向window發(fā)送makeKeyAndVisible消息以顯示出來(lái),這些都是UIApplicationMain在后臺(tái)完成的,所以application:didFinishLaunchingWithOptions:方法的實(shí)現(xiàn)是空的。
第三種是使用xib文件:
1.刪除Info.plist文件中的“Main storyboard file base name”一項(xiàng)。
2.創(chuàng)建一個(gè)xib文件,拖一個(gè)Window到畫布中(包含一個(gè)Window就行)。
3.將xib文件 File's Owner的Identity inspector中的class設(shè)置為應(yīng)用程序代理類。
4.在代理類中添加如下屬性:
@PRoperty (strong, nonatomic) IBOutlet UIWindow *window;
(代理類的頭文件原本有window屬性,改成上面一樣即可)
5.將window屬性連接起來(lái)。
6.在application:didFinishLaunchingWithOptions:方法中加載xib文件,代碼如下:
[[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:nil];
1.3 視圖的幾個(gè)重要屬性
1 frame 聲明如下:
@property(nonatomic) CGRect frame;
frame 表示的是視圖矩陣在父視圖中的位置,用的是父視圖的坐標(biāo)系統(tǒng),默認(rèn)情況下,父視圖的坐標(biāo)系統(tǒng)會(huì)以左上角為原點(diǎn),x坐標(biāo)向右,y坐標(biāo)向下,視圖創(chuàng)建的時(shí)候應(yīng)該設(shè)置frame ,就像上面那樣,不設(shè)置的話 它的默認(rèn)值是{{0,0},{0,0}}。
2 bounds 聲明如下:
@property(nonatomic) CGRect bounds;
bounds 和 frame 只有唯一一個(gè)不同點(diǎn),
frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))
bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))
3 center 聲明如下:
@property(nonatomic) CGPoint center;
center 無(wú)論從字面意思還是類型來(lái)看都知道表示的是一個(gè)中心點(diǎn),和bounds一樣參照點(diǎn)是本身坐標(biāo)系統(tǒng)。
4 transform 聲明如下:
@property(nonatomic) CGAffineTransform transform;
transform 用來(lái)提供旋轉(zhuǎn) 縮放 平移子類的變換,默認(rèn)情況下transform的值為CGAffineTransformIdentity(沒(méi)有可見(jiàn)效果),視圖的任何變換都是圍繞center來(lái)進(jìn)行的,center保持不變。
改變transform 的值使用以“CGAffineTransformMake” 開(kāi)頭的函數(shù)。
演示:
UIView *v1 = [[UIView alloc] initWithFrame:CGRectMake(50, 150, 200, 200)];v1.backgroundColor = [UIColor redColor];[self.view addSubview:v1];v1.transform = CGAffineTransformMakeRotation(45 * M_PI/180);
其他變換效果都大同小異,就不一一演示了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注