iOS CALayer總結(jié)——圖層幾何

最近看了一下關(guān)于圖層和動畫的內(nèi)容耿导,所以寫了一份總結(jié)声怔,算是對這些內(nèi)容的匯總吧,都是一些簡單的基礎(chǔ)知識碎节,不知道大家都了不了解捧搞。
除了和用戶的交互之外,圖層的很多屬性和視圖基本上都是一樣的,今天就先從CALayer的一些基礎(chǔ)的屬性入手胎撇,沒有套路和技巧介粘,只是對屬性的介紹:

一、contents

contents是CALayer的一個屬性:@property(nullable, strong) id contents;它的類型是id晚树,使用contents我們可以為一個普通的圖層添加一張圖片姻采,但是在賦值的時候,只有CGImageRef類型才有效爵憎,并且需要使用bridged關(guān)鍵字進行轉(zhuǎn)換慨亲,因為CGImageRef并不是一個Cocoa對象,而是一個Core Foundation類型宝鼓,所有正確的賦值方式為:

UIImage *image = [UIImage imageNamed:@"image_1.jpg"];
    self.layerView.layer.contents = (__bridge id)image.CGImage;

效果和使用UIImageView時一樣一樣的:


效果圖.png

和contents相關(guān)的還有以下幾個屬性:
contentsGravity刑棵、contentsScale、contentsRect愚铡、contentsCenter

contentsGravity

contentsGravity和UIView的contentMode屬性的作用是相似的蛉签,我們可以看到上面的效果圖中的圖片被拉伸了,我們平時在使用UIImageView展示圖片的時候也會出現(xiàn)這種情況沥寥,我們設(shè)置contentMode屬性就可以解決碍舍,在圖層中,我們使用contentsGravity屬性就可以了邑雅。
contentsGravity有以下這些可選的值:

kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill
值得注意的是:這些值并不是枚舉片橡,他們都是常量字符串。
為我們上面的代碼再添加一句:

self.layerView.layer.contentsGravity = kCAGravityResizeAspect;

我們可以發(fā)現(xiàn)淮野,圖片就正常了捧书,效果如下:

效果圖-2.png
contentsScale

contentsScale 屬性定義了contents中圖片的的像素尺寸和視圖大小的比例,它用來判斷在繪制圖層的時候應(yīng)該為contents創(chuàng)建的空間大小录煤,和需要顯示的圖片的拉伸度鳄厌。如果contentsScale設(shè)置為1.0,將會以每個點1個像素繪制圖片妈踊,如果設(shè)置為2.0了嚎,則會以每個點2個像素繪制圖片,這就是Retina屏幕了廊营。
如果我們已經(jīng)使用contentsGravity屬性使圖片拉伸了歪泳,那么我們再設(shè)置contentsScale就會失效(不是所有的contentsGravity的值都會拉伸圖片)。
我們先將設(shè)置contentsGravity的代碼改為:
self.layerView.layer.contentsGravity = kCAGravityCenter;
然后添加:

self.layerView.layer.contentsScale = image.scale;
我們發(fā)現(xiàn)顯示的圖片跟圖片本身大小一致:

效果圖-3.png

我這里使用的是1倍圖露筒,如果我們?yōu)閳D片的名字后面添加一個@2x呐伞,然后就變成這樣了:


效果圖-4.png

原因就不用我多說了吧。

contentsRect

contentsRect屬性規(guī)定了我們在contents中可以顯示的圖片的區(qū)域慎式,這個理解起來也很容易伶氢,但是要注意的是:contentsRect不是一個絕對值(點或者像素)趟径,而是一個相對值,以左上角為坐標原點癣防,單位坐標在0~1之間蜗巧,當然也可以是負數(shù)。設(shè)置了contentsRect屬性只顯示左上角1/4區(qū)域:

self.layerView.layer.contentsRect = CGRectMake(0, 0, 0.5, 0.5);

效果圖如下:


效果圖-5.png
contentsCenter

我們在日常的開發(fā)中蕾盯,有時候UI給的圖片我們在顯示的時候需要對圖片進行拉伸幕屹,但是又想只拉伸中間的部分,四周的一些區(qū)域不拉伸级遭,我們會使用-resizableImageWithCapInsets:方法設(shè)置一下四周不被拉伸的區(qū)域望拖,contentsCenter屬性在圖層中起到的也是這個作用,contentsCenter的默認值是{0, 0, 1, 1}挫鸽,也就是整張圖片都被拉伸说敏,如果將值改為{0.25,0.25丢郊,0.5像云,0.5}就表示x,y都從左上角1/4處開始蚂夕,寬和高分別為圖片尺寸的一半大小,所圍成的區(qū)域被拉伸腋逆,其他區(qū)域不拉伸婿牍。由于我找的圖片素材效果不太明顯,所有就不貼效果圖了惩歉。

二等脂、幾何屬性

在圖層的幾個幾何屬性中爆价,我們重點介紹anchorPoint跪但。
不過在此之前也簡單說一下frame删铃、bounds危尿、position处嫌,一句話總結(jié):frame代表了圖層的外部坐標(相對于父圖層)嘉冒,bounds是內(nèi)部坐標(相對于自身)蛙奖,position代表了相對于父圖層anchorPoint所在的位置惫撰。改變圖層的bounds亮垫、boundstransform模软,都會令frame發(fā)生改變。
比如饮潦,我們將圖層旋轉(zhuǎn)45度燃异,然后看一下旋轉(zhuǎn)前后圖層的frame:

NSLog(@"x:%f,y:%f",self.layerView.layer.frame.origin.x,self.layerView.layer.frame.origin.y);
    self.layerView.layer.affineTransform = CGAffineTransformMakeRotation(M_PI_4);
NSLog(@"x:%f,y:%f",self.layerView.layer.frame.origin.x,self.layerView.layer.frame.origin.y);

x:112.500000,y:233.500000
x:63.756313,y:209.756313

anchorPoint

上面說到,position代表了相對于父圖層anchorPoint所在的位置继蜡,通過改變anchorPoint回俐,圖層的frame也會發(fā)生改變逛腿。要理解anchorPoint很容易,直接上代碼就很直觀了:

創(chuàng)建兩個位置和大小都相同的layer仅颇,layer1為參照圖層单默,此時兩個圖層是重合的,

CALayer *layer1 = [[CALayer alloc]init];
    layer1.frame = CGRectMake(100, 200, 150, 100);
    layer1.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer1];
    CALayer *layer2 = [[CALayer alloc]init];
    layer2.frame = CGRectMake(100, 200, 150, 100);
    layer2.backgroundColor = [UIColor greenColor].CGColor;
    [self.view.layer addSublayer:layer2];
    NSLog(@"frame:{%.0f,%.0f,%.0f,%.0f}",layer2.frame.origin.x,layer2.frame.origin.y,layer2.frame.size.width,layer2.frame.size.height);
    NSLog(@"bounds:{%.0f,%.0f,%.0f,%.0f}",layer2.bounds.origin.x,layer2.bounds.origin.y,layer2.bounds.size.width,layer2.bounds.size.height);
    NSLog(@"positon:{%.0f,%.0f}",layer2.position.x,layer2.position.y);
    NSLog(@"anchorPoint:{%.0f,%.0f}",layer2.anchorPoint.x,layer2.anchorPoint.y);
anchorPoint改變前.png

改變layer2的anchorPoint為{0灵莲,0}:

layer2.anchorPoint = CGPointMake(0, 0);
anchorPoint改變后.png

anchorPoint是在做圖層變換和動畫的時候雕凹,非常重要的一個屬性,它是圖層變換的一個把柄政冻,比如圖層在做旋轉(zhuǎn)的時候枚抵,就是以anchorPoint為基點旋轉(zhuǎn)的。實際上明场,在UIView中也有anchorPoint汽摹,只不過,系統(tǒng)并沒有暴露這個屬性苦锨,UIView的center屬性和圖層的position屬性是同一個概念逼泣,anchorPoint默認是{0.5,0.5}舟舒,所以UIView得center就是中心點了拉庶。

zPosition

CALayer存在于一個三維空間當中,它還有一個用來表示圖層在Z軸方向上位置的屬性zPosition秃励,默認為0氏仗,如果改變這個屬性,就會改變多個圖層之間的顯示順序夺鲜。就用上面的例子演示一下皆尔,改變紅色圖層的zPosition,圖層是一個非常非常薄的東西币励,所以我們只需要為zPosition設(shè)置一個比較小的值就可以了慷蠕,比如說:1.0:

 layer1.zPosition = 1.0f;
效果圖.png

這樣,兩個圖層的順序就發(fā)生了改變食呻,不過需要注意的是:這只是用戶視角上看起來兩個圖層的順序改變了流炕,實際上兩個圖層在父圖層上還是原來的順序。

關(guān)于設(shè)置圖層效果的屬性仅胞,相信大家其實再熟悉不過了:
比如:圓角(conrnerRadius)浪感、邊框(borderWidthborderColor)饼问、陰影(shadowColor影兽、shadowOffsetshadowRadius莱革、shadowOpacity)峻堰、
圖層蒙版(mask)讹开,在這里,就不啰嗦了捐名,還需要節(jié)省時間旦万,在接下來的文章中去總結(jié)更多更豐富的關(guān)于圖層的內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镶蹋,一起剝皮案震驚了整個濱河市成艘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贺归,老刑警劉巖淆两,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拂酣,居然都是意外死亡秋冰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門婶熬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剑勾,“玉大人,你說我怎么就攤上這事赵颅∷淞恚” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵饺谬,是天一觀的道長洲赵。 經(jīng)常有香客問我,道長商蕴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任芝发,我火速辦了婚禮绪商,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辅鲸。我一直安慰自己格郁,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布独悴。 她就那樣靜靜地躺著例书,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刻炒。 梳的紋絲不亂的頭發(fā)上决采,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音坟奥,去河邊找鬼树瞭。 笑死拇厢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晒喷。 我是一名探鬼主播孝偎,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼凉敲!你這毒婦竟也來了衣盾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤爷抓,失蹤者是張志新(化名)和其女友劉穎势决,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體废赞,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡徽龟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唉地。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片据悔。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耘沼,靈堂內(nèi)的尸體忽然破棺而出极颓,到底是詐尸還是另有隱情,我是刑警寧澤群嗤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布菠隆,位于F島的核電站,受9級特大地震影響狂秘,放射性物質(zhì)發(fā)生泄漏骇径。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一者春、第九天 我趴在偏房一處隱蔽的房頂上張望破衔。 院中可真熱鬧,春花似錦钱烟、人聲如沸晰筛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读第。三九已至,卻和暖如春拥刻,著一層夾襖步出監(jiān)牢的瞬間怜瞒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工般哼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盼砍,地道東北人尘吗。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像浇坐,于是被迫代替她去往敵國和親睬捶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

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