CALayer不常見屬性梳理

1.contentGravity屬性

類似UIImageView的contentMode屬性,是一個(gè)NSString類型

kCAGravityCenter 
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill

2. contentsScale屬性

就是表示一個(gè)點(diǎn)表示幾個(gè)像素
設(shè)置為1.0,將會(huì)以每個(gè)點(diǎn)1個(gè)像素繪制圖片,如果設(shè)置為 2.0,則會(huì)以每個(gè)點(diǎn)2個(gè)像素繪制圖片

3.contentsRect

在圖層的上顯示寄宿圖的摸個(gè)部分,也就是截取寄宿圖的某個(gè)部分來(lái)填充滿整個(gè)圖層

默認(rèn)的 contentsRect是{0, 0, 1, 1},這意味著整個(gè)寄宿圖默認(rèn)都是可見的,

1691344B-4FCE-48BC-8A4D-70A6FCF489AD.jpeg

**應(yīng)用:開發(fā)中可以讓UI提供一張大圖,然后自己根據(jù)需求截取部分圖片 網(wǎng)易的大轉(zhuǎn)盤的背景色就是整個(gè)方式(圖片拼合后可以打包整合到一張大圖上一次性載入。相比多次載入不同的 圖片,這樣做能夠帶來(lái)很多方面的好處:內(nèi)存使用,載入時(shí)間,渲染性能等等)

4.anchorPoint 屬性 和 position屬性

anchorPoint 是單位坐標(biāo)相對(duì)于本身的;
position 是相對(duì)于父控件的指的是anchorPoint 在父控件的位置,也就是說他們指的是同一個(gè)東西 ,只是不同坐標(biāo)系不同表現(xiàn)罷了

5. 坐標(biāo)系的轉(zhuǎn)換

  • (CGPoint)convertPoint:(CGPoint)p fromLayer:(nullable CALayer *)l;
  • (CGPoint)convertPoint:(CGPoint)p toLayer:(nullable CALayer *)l;
  • (CGRect)convertRect:(CGRect)r fromLayer:(nullable CALayer *)l;
  • (CGRect)convertRect:(CGRect)r toLayer:(nullable CALayer *)l;

6. zPosition屬性

這個(gè)屬性可以改變圖層顯示的層級(jí)
一般圖層的顯示順序是后添加的在最上面,通過改屬性可以修改顯示前后關(guān)系,(不能改變和父控件的圖層關(guān)系)
1.并列圖層
2.修改zPosition

7. conrnerRadius屬性

用來(lái)設(shè)置圓角率的 只對(duì)背景色有效對(duì)背景圖片和子圖層無(wú)效 配合使用masksToBounds可以起作用

8. 邊框 和 陰影

這個(gè)兩個(gè)要放在一起比較
邊框:只會(huì)對(duì)圖層本身的大小起作用 ,對(duì)于超出的部分不管
陰影:圖層邊框不同,圖層的陰影繼承自內(nèi)容的外形,而不是根據(jù)邊界和角半 徑來(lái)確定(包括子視圖,如 果有的話)考慮在內(nèi),然后通過這些來(lái)完美搭配圖層形狀從而創(chuàng)建一個(gè)陰影

陰影代碼
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    redView.backgroundColor = [UIColor redColor];
    redView.layer.zPosition = 1.0;
    redView.layer.shadowOpacity = 0.5;
    redView.layer.shadowOffset = CGSizeMake(5, 3);
    redView.layer.shadowColor = [UIColor blackColor].CGColor;
    [self.view addSubview:redView];
    
    UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
    blueView.backgroundColor = [UIColor blueColor];
    [redView addSubview:blueView];

效果

20BE823C-BD37-4F60-95D3-B1D4FF60C391.jpeg

8.shadowPath

自定義陰影形狀 (例如有這樣一個(gè)需求需要在view的四周都加上陰影)就可以使用這個(gè)屬性

 UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    redView.backgroundColor = [UIColor redColor];
    redView.layer.zPosition = 1.0;
    redView.layer.shadowOpacity = 0.5;
    redView.layer.shadowOffset = CGSizeMake(0, 0);
    redView.layer.shadowColor = [UIColor blackColor].CGColor;
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(-10, -10, 120, 120)];
    redView.layer.shadowPath =  path.CGPath;
    [self.view addSubview:redView];

87B01D36-C442-40AA-A569-66AA1728779F.jpeg

我們已經(jīng)知道圖層陰影并不總是方的,而是從圖層內(nèi)容的形狀繼承而來(lái)。這看上 去不錯(cuò),但是實(shí)時(shí)計(jì)算陰影也是一個(gè)非常消耗資源的,尤其是圖層有多個(gè)子圖層, 每個(gè)圖層還有一個(gè)有透明效果的寄宿圖的時(shí)候。
如果你事先知道你的陰影形狀會(huì)是什么樣子的,你可以通過指定一 個(gè) shadowPath 來(lái)提高性能。 shadowPath 是一個(gè) CGPathRef 類型(一個(gè)指 向 CGPath 的指針)。 CGPath 是一個(gè)Core Graphics對(duì)象,用來(lái)指定任意的一個(gè)矢量圖形。我們可以通過這個(gè)屬性單獨(dú)于圖層形狀之外指定陰影的形狀。
<摘自iOS高級(jí)動(dòng)畫技巧課本>

8.拉伸過濾 minificationFilter 和 magnificationFilter

總 得來(lái)講,當(dāng)我們視圖顯示一個(gè)圖片的時(shí)候,都應(yīng)該正確地顯示這個(gè)圖片原因如下:
能夠顯示最好的畫質(zhì),像素既沒有被壓縮也沒有被拉伸。 能更好的使用內(nèi)存,因?yàn)檫@就是所有你要存儲(chǔ)的東西。 最好的性能表現(xiàn),CPU不需要為此額外的計(jì)算。
不過有時(shí)候,顯示一個(gè)非真實(shí)大小的圖片確實(shí)是我們需要的效果。比如說一個(gè)頭 像或是圖片的縮略圖,再比如說一個(gè)可以被拖拽和伸縮的大圖。這些情況下,為同 一圖片的不同大小存儲(chǔ)不同的圖片顯得又不切實(shí)際。
當(dāng)圖片需要顯示不同的大小的時(shí)候,有一種叫做拉伸過濾的算法就起到作用了。 它作用于原圖的像素上并根據(jù)需要生成新的像素顯示在屏幕上。
事實(shí)上,重繪圖片大小也沒有一個(gè)統(tǒng)一的通用算法。這取決于需要拉伸的內(nèi)容, 放大或是縮小的需求等這些因素。 CALayer 為此提供了三種拉伸過濾方法,他們 是:

kCAFilterLinear
kCAFilterNearest
kCAFilterTrilinear

minification(縮小圖片)和magnification(放大圖片)默認(rèn)的過濾器都 是 kCAFilterLinear ,這個(gè)過濾器采用雙線性濾波算法,它在大多數(shù)情況下都表 現(xiàn)良好。雙線性濾波算法通過對(duì)多個(gè)像素取樣最終生成新的值,得到一個(gè)平滑的表 現(xiàn)不錯(cuò)的拉伸。但是當(dāng)放大倍數(shù)比較大的時(shí)候圖片就模糊不清了。
非常相似,大部分情況下二者都 看不出來(lái)有什么差別。但是,較雙線性濾波算法而言,三線性濾波算法存儲(chǔ)了多個(gè) 大小情況下的圖片(也叫多重貼圖),并三維取樣,同時(shí)結(jié)合大圖和小圖的存儲(chǔ)進(jìn) 而得到最后的結(jié)果。

個(gè)人總結(jié):一般當(dāng)圖片失幀的時(shí)候 幾個(gè)屬性都可以試一下 主觀看看

9.presentationLayer和modelLayer

改變一個(gè)CALayer的屬性的時(shí)候,實(shí)際上改變的是它最終的一個(gè)狀態(tài),怎么理解這句話呢,比如你修改一個(gè)圖層的位置position(1.1)到position(100,100),屬性的值是立即就變化了,但是那是他最后回到(100,100)但是映射到屏幕上并沒有立即發(fā)生.而presentationLayer就是從你修改的圖層的中間狀態(tài),術(shù)語(yǔ)"呈現(xiàn)圖層",它其實(shí)是CALayer的復(fù)制品但是你展示的具體某個(gè)時(shí)刻CALayer的屬性值,而presentationLayer調(diào)用modelLayer就可以得到它復(fù)制的主體.應(yīng)用:
1.如果你對(duì)某個(gè)圖層進(jìn)行動(dòng)畫操作的過程中,需要對(duì)它進(jìn)行時(shí)間處理,此時(shí)用這個(gè)最合適了

    CGPoint point = [[touches anyObject] locationInView:self.view];
    
    //check if we've tapped the moving layer
    
    if ([self.colorLayer.presentationLayer hitTest:point]) {
        
        //randomize the layer background color
        
        CGFloat red = arc4random() / (CGFloat)INT_MAX;
        
        CGFloat green = arc4random() / (CGFloat)INT_MAX;
        
        CGFloat blue = arc4random() / (CGFloat)INT_MAX;
        
        self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor;
                                           
    } else {
                                               
       //otherwise (slowly) move the layer to new position
       [CATransaction begin];
       
       [CATransaction setAnimationDuration:8.0];
       
       self.colorLayer.position = point;
       
       [CATransaction commit];
        
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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