初探CALayer屬性

一直覺得一個view就一個layer

到今天才發(fā)現(xiàn)不是這樣子的

其關系圖如下

圖片.png

CALayer屬性表如下

圖片.png

CALayer和UIView的區(qū)別

1.UIView是UIKit的(只能iOS使用)哥倔,CALayer是QuartzCore的(iOS和mac os通用)

2.UIView繼承UIResponder,CALayer繼承NSObject,UIView比CALayer多了一個事件處理的功能缴淋,也就是說,CALayer不能處理用戶的觸摸事件民鼓,而UIView可以

3.UIView來自CALayer,是CALayer的高層實現(xiàn)和封裝蟋滴,UIView的所有特性來源于CALayer支持

4.CABasicAnimation粹庞,CAAnimation,CAKeyframeAnimation等動畫類都需要加到CALayer上

其實UIView之所以能顯示在屏幕上捌朴,完全是因為它內(nèi)部的一個圖層

在創(chuàng)建UIView對象時吴攒,UIView內(nèi)部會自動創(chuàng)建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層
@property(nonatomic,readonly,retain) CALayer *layer;

當UIView需要顯示到屏幕上時砂蔽,會調(diào)用drawRect:方法進行繪圖洼怔,并且會將所有內(nèi)容繪制在自己的圖層上,繪圖完畢后左驾,系統(tǒng)會將圖層拷貝到屏幕上镣隶,于是就完成了UIView的顯示

換句話說,UIView本身不具備顯示的功能诡右,是它內(nèi)部的層才有顯示功能

關于CALayer的疑惑

首先
CALayer是定義在QuartzCore框架中的(Core Animation)
CGImageRef安岂、CGColorRef兩種數(shù)據(jù)類型是定義在CoreGraphics框架中的
UIColor、UIImage是定義在UIKit框架中的

其次
QuartzCore框架和CoreGraphics框架是可以跨平臺使用的帆吻,在iOS和Mac OS X上都能使用
但是UIKit只能在iOS中使用

為了保證可移植性域那,QuartzCore不能使用UIImage、UIColor猜煮,只能使用CGImageRef次员、CGColorRef

今天發(fā)現(xiàn)個有趣的事情 就是我們方法名可以寫中文!M醮J缥怠!c底I采馈!C讼贰绪妹!

下面是我在layer那敲的代碼給各位分享一下

import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];

    [self 仿射變換_07];

}

pragma mark - 仿射變換

  • (void)仿射變換_07
    {
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(60, 60, 200, 300);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];

    //設置層內(nèi)容
    layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"3"].CGImage);

    //x軸旋轉(zhuǎn)45度
    //layer.transform = CATransform3DMakeRotation(88(M_PI)/180, 1, 0, 0);
    //旋轉(zhuǎn)45度 度數(shù) x y z
    layer.transform = CATransform3DMakeRotation(45
    (M_PI)/180, 0.5, 1, 1);

    /*
    CATransform3DMakeRotation:3D旋轉(zhuǎn)
    CATransform3DTranslate:3D位移
    CATransform3DMakeScale:3D比例
    */

    //仿射變換
    //layer.affineTransform = CGAffineTransformMakeRotation(<#CGFloat angle#>);
    }

pragma mark - 剪切圖片的一部分

  • (void)剪切圖片的一部分_06
    {
    int width = 80;
    int height = 100;

    int sapce = 1;

    for(int i = 0; i < 9; i++)
    {
    UIView *view = [[UIView alloc] init];

      view.frame = CGRectMake(60 + (width + sapce) * (i%3), 80 + (height + sapce) * (i/3), width, height);
      view.backgroundColor = [UIColor redColor];
      //設置層的內(nèi)容
      view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpeg"].CGImage);
      //設置圖片剪切的范圍  [0,1]  contentsRect 圖層顯示內(nèi)容的大小和位置
      view.layer.contentsRect = CGRectMake(1.0/3.0 * (i%3), 1.0/3.0 * (i/3), 1.0/3.0, 1.0/3.0);
      [self.view addSubview:view];
      
      /*
       1:(0,0柿究,1/3,1/3)
       2: (1/3,0邮旷,1/3,1/3)
       3: (2/3,0,1/3,1/3)
       */
    

    }
    }

pragma mark - 圖層添加邊框和圓角

  • (void)圖層添加邊框和圓角_05
    {
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(60, 60, 100, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];

    //邊框顏色
    layer.borderColor = [UIColor greenColor].CGColor;
    //邊框?qū)挾?br> layer.borderWidth = 3;
    //圓角
    layer.cornerRadius = 10;
    }

pragma mark - 剪切超過父圖層的部分

  • (void)剪切超過父圖層的部分_04
    {
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(60, 60, 100, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];

    CALayer *layer2 = [CALayer layer];
    layer2.frame = CGRectMake(30, 30, 100, 100);
    layer2.backgroundColor = [UIColor blueColor].CGColor;
    [layer addSublayer:layer2];

    //剪切超過父圖層的部分
    layer.masksToBounds = YES;
    }

pragma mark -陰影路徑

  • (void)陰影路徑_03
    {
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(60, 60, 100, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];

    //1表示不透明,注意:設置陰影當前值不能為0蝇摸,默認是0
    layer.shadowOpacity = 1.0;
    //陰影顏色
    layer.shadowColor = [UIColor yellowColor].CGColor;

    //創(chuàng)建路徑
    CGMutablePathRef path = CGPathCreateMutable();
    //橢圓
    CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 0, 200, 200));

    layer.shadowPath = path;

    CGPathRelease(path);

}

pragma mark - 添加陰影_02

  • (void)層的陰影_02
    {
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(60, 60, 100, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];

    //1表示不透明,注意:設置陰影當前值不能為0婶肩,默認是0
    layer.shadowOpacity = 0.9;
    //陰影顏色
    layer.shadowColor = [UIColor yellowColor].CGColor;
    //陰影偏移 ->x正 <-x負 y同理
    layer.shadowOffset = CGSizeMake(10, -10);
    //陰影的圓角半徑
    layer.shadowRadius = 10;
    }

pragma mark - 圖層內(nèi)容和內(nèi)容模式_01

  • (void)圖層內(nèi)容和內(nèi)容模式_01 {
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(20, 20, 100, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];

    //設置層內(nèi)容
    layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"1.jpeg"].CGImage);
    //內(nèi)容模式办陷,類似于UIImageView的contentMode。默認是填充整個區(qū)域 kCAGravityResize
    //kCAGravityResizeAspectFill 這個會向左邊靠 貼到view的邊邊上
    //kCAGravityResizeAspect 這個好像就是按比例了 反正是長方形
    layer.contentsGravity = kCAGravityResizeAspect;

    //設置控制器視圖的背景圖片
    /*
    性能很高律歼。
    */
    self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"3"].CGImage);
    }

@end

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民镜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子险毁,更是在濱河造成了極大的恐慌制圈,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔况,死亡現(xiàn)場離奇詭異鲸鹦,居然都是意外死亡,警方通過查閱死者的電腦和手機跷跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門馋嗜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吵瞻,你說我怎么就攤上這事葛菇。” “怎么了橡羞?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵眯停,是天一觀的道長。 經(jīng)常有香客問我尉姨,道長庵朝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任又厉,我火速辦了婚禮,結果婚禮上椎瘟,老公的妹妹穿的比我還像新娘覆致。我一直安慰自己,他們只是感情好肺蔚,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布煌妈。 她就那樣靜靜地躺著,像睡著了一般宣羊。 火紅的嫁衣襯著肌膚如雪璧诵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天仇冯,我揣著相機與錄音之宿,去河邊找鬼。 笑死苛坚,一個胖子當著我的面吹牛比被,可吹牛的內(nèi)容都是我干的色难。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼等缀,長吁一口氣:“原來是場噩夢啊……” “哼枷莉!你這毒婦竟也來了?” 一聲冷哼從身側響起尺迂,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤笤妙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后噪裕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹲盘,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年州疾,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜限。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡严蓖,死狀恐怖薄嫡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颗胡,我是刑警寧澤毫深,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站毒姨,受9級特大地震影響哑蔫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弧呐,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一闸迷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俘枫,春花似錦腥沽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茅信,卻和暖如春盾舌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蘸鲸。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工妖谴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚贾。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓窖维,卻偏偏與公主長得像榆综,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铸史,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果鼻疮,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌琳轿。在這里你可以看...
    每天刷兩次牙閱讀 8,471評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果判沟,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌崭篡。在這里你可以看...
    F麥子閱讀 5,104評論 5 13
  • 一挪哄、CAShapelayer 我們知道可以不使用圖片情況下利用CGpath去構建任意形狀的陰影。其實我們也可...
    小貓仔閱讀 1,440評論 0 5
  • 前言:關于貝塞爾曲線與CAShapeLayer的學習 學習Demo演示: 貝塞爾曲線簡單了解 使用UIBezier...
    麥穗0615閱讀 17,861評論 18 149
  • 轉(zhuǎn)載:http://www.reibang.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,168評論 0 13