淺談CALayer

  • 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è)置就可以
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容