- 1.UIview和CALayer的區(qū)別和聯(lián)系
- 2.通過layer 設(shè)置UIView的陰影
- 3.直接進(jìn)行l(wèi)ayer操作
- 4.隱式動畫
- 5.通過layer進(jìn)行簡單的動畫效果
1.UIview和CALayer的區(qū)別和聯(lián)系
- UIview 是所有視圖的基類
- CALayer是圖層類
但是他倆是平行的層級關(guān)系,每個(gè)UIview都有一個(gè)CALayer的實(shí)例圖層屬性,他們的出現(xiàn)是為了視圖繪制,顯示和布局解耦,其中UIwindow是繼承自uiview的
聯(lián)系:
- CALayer在UIview背后提供更加豐富靈活的圖形操作
- UIview作為CALayer的代理更加快速的幫CALayer顯示一些常用的ui元素并提供交互
區(qū)別:
- 響應(yīng):UIview 繼承自uiresponder,可以響應(yīng)用戶事件,CALayer 繼承自nsobject,無法響應(yīng)用戶事件
- 分工:UIview側(cè)重于隊(duì)顯示內(nèi)容的管理和整體布局,CALayer側(cè)重顯示內(nèi)容的繪制.顯示和動畫
- 框架:UIview屬于uikit框架(主要構(gòu)件用戶界面),CALayer屬于quartzcore框架,CGColor屬于coreGraphics
綜上:CAlayer更加輕量級,性能更高,但是擴(kuò)展性差,假設(shè)突然一天需要交互了,就要emmm了
2.通過layer 設(shè)置UIView的陰影
self.aView = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];
self.aView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.aView];
[self layerforView];
- (void)layerforView
{
//先設(shè)置透明度,不然也看不到
self.aView.layer.shadowOpacity = 1;//透明度,Defaults to 0,取值[0 1]
self.aView.layer.shadowColor = [UIColor blueColor].CGColor;
self.aView.layer.shadowRadius = 5;//陰影模糊半徑,Defaults to 3.
self.aView.layer.shadowOffset = CGSizeMake(-15, -15);//偏移量,Defaults to (0, -3)
//眾所周知,通常圓角,遮罩,不透明度,陰影,漸變,光柵化和抗鋸齒等這些都會觸發(fā)離屏渲染,
//我有一篇文章也講述到了離屏渲染 http://www.itdecent.cn/p/6225529f4015
//使用shadowPath據(jù)說可以減少渲染時(shí)損耗的性能
self.aView.layer.shadowPath = [[UIBezierPath bezierPathWithRect:self.aView.bounds] CGPath];
//邊框
self.aView.layer.borderWidth = 2;//邊框向內(nèi)縮進(jìn)
self.aView.layer.borderColor = [UIColor blackColor].CGColor;
//還是那個(gè)圓角
self.aView.layer.cornerRadius = 50;
//多圖層時(shí)才需要設(shè)置下面這個(gè)屬性,具體還闊以看上面的離屏渲染
//masksToBounds將底層的圖層設(shè)置成圓角,并進(jìn)行裁剪掉以外的
self.aView.layer.masksToBounds = YES;//通常使用在imageView和Btn上,image是設(shè)置在layer.contents中
}
效果圖:過于基礎(chǔ),略
3.直接進(jìn)行l(wèi)ayer操作
- (void)layerTest
{
self.la = [CALayer layer];
self.la.backgroundColor = [UIColor redColor].CGColor;
//此處設(shè)置bounds 而不是frame, 為了了解position 和 anchorPoint
// self.la.bounds = CGRectMake(0, 0, 100, 100);
self.la.frame = CGRectMake(0, 0, 100, 100);
[self.view.layer addSublayer:self.la];
self.la.contents = (__bridge id _Nullable)([UIImage imageNamed:@"0"].CGImage);
//以上設(shè)置的為bounds,會顯示layer的四分之一,因?yàn)殄^點(diǎn)默認(rèn)值的問題
//position設(shè)置layer在父層中的位置,以父層的左上角為原點(diǎn)
//anchorPoint 錨點(diǎn),以自身的左上角為原點(diǎn),Defaults to'(0.5, 0.5)',取值(0, 1),所以上圖只顯示右下角的四分之一
self.la.position = self.view.center;
self.la.anchorPoint = CGPointMake(0, 0);
}
4.隱式動畫
細(xì)心的人會發(fā)現(xiàn),touchesBegan的時(shí)候,設(shè)置修改self.la.position,會有動畫效果,如果你不想要
//只有自己創(chuàng)建的圖層才有隱式動畫
//上面點(diǎn)擊屏幕設(shè)置self.la.position = CGPointMake(0, 0); 是有動畫效果的
//取消隱式動畫(通過事務(wù))
[CATransaction begin];
//內(nèi)部設(shè)置
[CATransaction setDisableActions:YES]; //取消隱式動畫
//[CATransaction setAnimationDuration:2];
self.la.position = CGPointMake(0, 0);
[CATransaction commit];
5.通過layer進(jìn)行簡單的動畫效果
//旋轉(zhuǎn)為例 ,參數(shù)是 旋轉(zhuǎn)角度,旋轉(zhuǎn)軸 : x y z
self.aView.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 1);
//使用kvc一樣可以,不過要先把結(jié)構(gòu)體CATransform3DMakeRotation轉(zhuǎn)化成NSvalue,因?yàn)閗vc的value為id類型
//那么使用kvc做簡單的transform操作(平移,縮放,旋轉(zhuǎn))肯定更不在話下了,直接設(shè)置就可以