CALayer基礎(chǔ)知識(shí)一

一拧篮、CALayer和UIView
CALayer與UIView類似孕讳,是一些被層級(jí)關(guān)系樹(shù)管理的矩形塊涣易,和UIView的最大不同是不能處理用戶的交互良哲。
每一個(gè)UIView都有一個(gè)CALayer的屬性锹引,它的責(zé)任是創(chuàng)建并且管理這個(gè)圖層矗钟,以確保當(dāng)子視圖層級(jí)關(guān)系變化的時(shí)候,他們的關(guān)聯(lián)圖層也同樣對(duì)應(yīng)在層級(jí)關(guān)系樹(shù)當(dāng)中有相同的操作嫌变。
iOS提供CALayer和UIView兩個(gè)平行的層級(jí)關(guān)系是為了職責(zé)分離吨艇。UIView主要是對(duì)顯示內(nèi)容的管理而 CALayer 主要側(cè)重顯示內(nèi)容的繪制。
CALayer可以做而UIView不可以做得事情:
(1)陰影腾啥,圓角秸应,邊框
(2)3D變換
(3)非矩形范圍
(4)透明遮罩
(5)多級(jí)非線性動(dòng)畫(huà)

    CALayer *redLayer = [CALayer layer];
    redLayer.backgroundColor = [UIColor redColor].CGColor;
    redLayer.frame = CGRectMake(0, 0, 50, 50);
    [self.view.layer addSublayer:redLayer];

二、寄宿圖和contents屬性
1.寄宿圖:即為圖層中包含的圖碑宴,CALayer不僅可以創(chuàng)建帶有簡(jiǎn)單顏色的背景圖層软啼,還可以包含一張圖片。

2.contents屬性
CALayer可以通過(guò)一個(gè)contents屬性添加圖片

   UIImage *image = [UIImage imageNamed:@"icon_logo"];
    
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(50, 50, 50, 100);
    [self.view.layer addSublayer:layer];
    
    layer.contents = (__bridge id)image.CGImage;

需要注意:core foundation 和 cocoa對(duì)象不是類型兼容的延柠,需要通過(guò)bridged 關(guān)鍵字進(jìn)行轉(zhuǎn)換祸挪。在ARC環(huán)境下只需要layer.contents = (id)image.CGImage;id轉(zhuǎn)換就可以了

3.contentGravity

    layer.contentsGravity = kCAGravityResizeAspect;

類似于UIView中的cotentMode

4.contentsScale
contentsScale 屬性定義了寄宿圖的像素尺寸和視圖大小的比例,默認(rèn)為1.0

    layer.contentsScale = [UIScreen mainScreen].scale;

5.maskToBounds
maskToBounds對(duì)于超出邊界的內(nèi)存剪裁贞间,和UIView的clipsToBounds一樣

6.contentsRect
contentsRect 是使用了單位坐標(biāo)贿条,單位坐標(biāo)指定在0到1中間,是一個(gè)相對(duì)值增热,默認(rèn)的contentsRect是 {0整以,0,1峻仇,1}公黑,意味著整個(gè)寄宿圖都是可見(jiàn)的,如果我們指定為{0,0凡蚜,0.5人断,0.5}就只能顯示左上角的四分之一的圖片。
這樣我們可以得到一個(gè)實(shí)用的功能朝蜘,圖片拼合的用法——將多張圖片整合到一張大圖上面恶迈,一次性載入,相比多次載入不同的圖片谱醇,好處是:內(nèi)存使用暇仲,載入時(shí)間,渲染性能等等副渴。

//contentsRect 屬性
- (void)createCALayerContentsRect {
    CALayer *layer1 = [CALayer layer];
    layer1.frame = CGRectMake(200, 100, 50, 50);
    [self.view.layer addSublayer:layer1];
    
    CALayer *layer2 = [CALayer layer];
    layer2.frame = CGRectMake(300, 100, 50, 50);
    [self.view.layer addSublayer:layer2];
    
    [self addSpriteImage:[UIImage imageNamed:@"icon_logo"] withContentRet:CGRectMake(0, 0, 0.5, 0.5) layer:layer1];
    [self addSpriteImage:[UIImage imageNamed:@"icon_logo"] withContentRet:CGRectMake(0.5, 0.5, 0.5, 0.5) layer:layer2];
}

- (void)addSpriteImage:(UIImage *)image withContentRet:(CGRect)rect layer:(CALayer *)layer {
    layer.contents = (id)image.CGImage;
    layer.contentsGravity = kCAGravityResizeAspect;
    layer.contentsRect = rect;
}

7.contentsCenter

contentsCenter 與UIImage里的 - resizableImageWithCapInsets:方法類似奈附。

三、圖層幾何學(xué)
1.布局
UIView有三個(gè)布局屬性:frame佳晶,bounds桅狠,center,CALayer對(duì)應(yīng)的叫:frame轿秧,bounds中跌,position
Frame代表圖層的外部坐標(biāo),bounds是內(nèi)部坐標(biāo){0菇篡,0}是圖層的左上角漩符。position相當(dāng)于anchorPoint。
當(dāng)操縱視圖的frame驱还,實(shí)際上改變的是位于視圖下方的CALayer的frame嗜暴,對(duì)于視圖或者是圖層來(lái)說(shuō),frame是根據(jù)bounds议蟆,position闷沥,transform計(jì)算而來(lái)的,當(dāng)對(duì)圖層做變換的時(shí)候咐容,比如旋轉(zhuǎn)或者縮放舆逃,frame實(shí)際上代表了覆蓋在圖層旋轉(zhuǎn)之后的整個(gè)軸對(duì)齊的矩形區(qū)域,frame的寬高和bounds可能不一樣了戳粒。


1420016966634141.jpeg

2.錨點(diǎn)
默認(rèn)來(lái)說(shuō)路狮,anchorpoint位于圖層的中心點(diǎn),但是anchorpoint可以被移動(dòng)蔚约。

self.anchorPoint = CGPointMake(0.5f,0.9f);

3.坐標(biāo)系

- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;
- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;

- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;
- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;

4.翻轉(zhuǎn)的幾何結(jié)構(gòu)
geometryFlipped 設(shè)置為yes奄妨,則子圖層或者子視圖本來(lái)相對(duì)于左上角放置 改為 相對(duì)于左下角放置;

5.Z坐標(biāo)軸
CALayer存在一個(gè)三維空間當(dāng)中苹祟,除了position和anchorPoint之外砸抛,還有zPosition和anchorPointZ评雌。
可以改變圖層的顯示繪圖順序

6.Hit Testing

CGRectContainsRect(<#CGRect rect1#>, <#CGRect rect2#>)表示rect1和rect2是否相交
CGRectContainsPoint(<#CGRect rect#>, <#CGPoint point#>)表示rect中是否包含point坐標(biāo)
CGRectIntersectsRect(<#CGRect rect1#>, <#CGRect rect2#>)表示rect1中是否包含rect2

-hitTest:方法接受一個(gè)CGPoint類型的參數(shù),返回圖層本身锰悼,用于判斷point點(diǎn)擊了那個(gè)圖層

   CGPoint point = [[touches anyObject] locationInView:self.view];
    CALayer *layer = [self.view.layer hitTest:point];
    NSLog(@"%@",layer);
    if (layer == self.redLayer) {
        NSLog(@"yes");
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柳骄,一起剝皮案震驚了整個(gè)濱河市团赏,隨后出現(xiàn)的幾起案子箕般,更是在濱河造成了極大的恐慌,老刑警劉巖舔清,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丝里,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡体谒,警方通過(guò)查閱死者的電腦和手機(jī)杯聚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抒痒,“玉大人幌绍,你說(shuō)我怎么就攤上這事」氏欤” “怎么了傀广?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)彩届。 經(jīng)常有香客問(wèn)我伪冰,道長(zhǎng),這世上最難降的妖魔是什么樟蠕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任贮聂,我火速辦了婚禮,結(jié)果婚禮上寨辩,老公的妹妹穿的比我還像新娘吓懈。我一直安慰自己,他們只是感情好靡狞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布耻警。 她就那樣靜靜地躺著,像睡著了一般耍攘。 火紅的嫁衣襯著肌膚如雪榕栏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天蕾各,我揣著相機(jī)與錄音扒磁,去河邊找鬼。 笑死式曲,一個(gè)胖子當(dāng)著我的面吹牛妨托,可吹牛的內(nèi)容都是我干的缸榛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兰伤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼内颗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起敦腔,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤均澳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后符衔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體找前,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年判族,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躺盛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡形帮,死狀恐怖槽惫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辩撑,我是刑警寧澤界斜,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站槐臀,受9級(jí)特大地震影響锄蹂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜水慨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一得糜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晰洒,春花似錦朝抖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砌滞,卻和暖如春侮邀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贝润。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工绊茧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人打掘。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓华畏,卻偏偏與公主長(zhǎng)得像鹏秋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子亡笑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344