感覺自己學(xué)的東西很雜亂無章椿肩,iOS置逻、H5暴匠、小程序等等是時候分類梳理一下了精耐,要養(yǎng)成做筆記的習(xí)慣希太,以前一直這樣想克饶,從現(xiàn)在開始要行動起來!誊辉!不能懶了矾湃。
一 UIView 和 CALayer 的關(guān)系
一個按鈕、一個輸入框堕澄、一張圖片等等都UIView邀跃。UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它蛙紫。
UIView之所以會顯示在屏幕上是因為它里邊有一個層(CALayer),這個層是它的繪圖部分拍屑,里邊記錄了這個UIView的一些樣式屬性,UIVIew更像是一個CALayer的管理器坑傅,當(dāng)通過layer訪問它的屬性時僵驰,例如frame,其實都是在訪問它里邊CALayer的相關(guān)屬性唁毒。每當(dāng)UIView需要加載到屏幕上的時候蒜茴,會調(diào)用drawRect:方法把所有內(nèi)容繪制在CALayer上,然后系統(tǒng)把這個CALayer拷貝到屏幕上浆西,就完成了這個UIView的顯示粉私。
UIView自身不具備顯示功能,是因為內(nèi)部的層(CALayer)才有顯示的能力,而且這個默認的層不允許重新創(chuàng)建近零,但可以往層里面添加子層诺核,UIView可以通過addSubview:方法添加子視圖,類似地久信,CALayer可以通過addSublayer:方法添加子層
二 簡單運用
通過操作這個CALayer對象窖杀,可以很方便地調(diào)整UIView的一些界面屬性,比如:圓角大小入篮、邊框?qū)挾瘸率荨⒈尘邦伾取?/p>
設(shè)置陰影
imageView.layer.shadowColor = [UIColor redColor].CGColor;//陰影的顏色
imageView.layer.shadowOffset = CGSizeMake(5, 5);//偏移大小
imageView.layer.shadowOpacity = 0.8; //透明度
圓角大小
imageView.layer.cornerRadius = 6;
imageView.layer.masksToBounds = YES; //強制內(nèi)部的所有子層支持圓角效果
邊框?qū)挾群皖伾?imageView.layer.borderWidth = 5;
imageView.layer.borderColor = [UIColor redColor].CGColor;
旋轉(zhuǎn) (M_PI_4表示四分之π,順時針旋轉(zhuǎn)45°) 后面的(0, 0, 1) 表示Z軸這個向量(x,y,z) 效果就是Z軸順時針旋轉(zhuǎn)45°
imageView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
- UIView有一個layerClass方法,返回主layer所使用的類痊项,UIView的子類锅风,可以通過重載這個方法,來讓UIView使用不同的CALayer來顯示
- (class) layerClass {
return ([CAEAGLLayer class]);
}
- 當(dāng)然也可以向它的layer上添加子layer鞍泉,來完成某些特殊的表示皱埠。例
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer: grayCover];
會在View上敷上一層黑色的透明薄膜。
對比CALayer咖驮,UIView多了一個事件處理的功能边器。CALayer不能處理用戶的觸摸事件,而UIView可以托修,所以如果顯示出來的東西需要跟用戶進行事件處理用UIView忘巧,反之,用UIView或者CALayer都可以睦刃,當(dāng)然砚嘴,CALayer的性能會高一些,因為它少了事件處理的功能涩拙,更加輕量級际长。
UIView可以通過subviews屬性訪問所有的子視圖,類似地兴泥,CALayer也可以通過sublayers屬性訪問所有的子層
UIView可以通過superview屬性訪問父視圖工育,類似地,CALayer也可以通過superlayer屬性訪問父層
兩個UIView是父子關(guān)系搓彻,那么它們內(nèi)部的CALayer也是父子關(guān)系如绸。
layer可以設(shè)置圓角顯示,例如UIButton的效果好唯,也可以設(shè)置陰影顯示竭沫,但是如果layer樹中的某個layer設(shè)置了圓角,樹中所有l(wèi)ayer的陰影效果都將顯示不了了骑篙。如果既想有圓角又想要陰影蜕提,好像只能做兩個重疊的UIView,一個的layer顯示圓角靶端,一個的layer顯示陰影.....
三 谎势、 總結(jié)
- UIView的顯示過程:當(dāng)UIView需要顯示時,它內(nèi)部的層會準(zhǔn)備好一個CGContextRef(圖形上下文)杨名,然后調(diào)用delegate(這里就是UIView)的drawLayer:inContext:方法脏榆,并且傳入已經(jīng)準(zhǔn)備好的CGContextRef對象。而UIView在drawLayer:inContext:方法中又會調(diào)用自己的drawRect:方法
- 平時在drawRect:中通過UIGraphicsGetCurrentContext()獲取的就是由層傳入的CGContextRef對象台谍,在drawRect:中完成的所有繪圖都會填入層的CGContextRef中须喂,然后被拷貝至屏幕