CALayer

1.什么是Layer, ?有什么用?

UIView之所以能顯示在屏幕上,完全是因為它內部有一layer;

UIView本質不具備顯示的功能;

CALayer是Core Animation操作的對象, 這也是Layer為什么是CA打頭的原因;

CALayer可能很方便的添加一些外觀效果

可以做圓角、陰影、邊框等效果 ?每個UIView內部都有一個Layer的屬性;

在實現核心動畫時,本質上是將CALayer中的內容轉換成位圖,從而便于圖形硬件的操縱;

2.UIKit框架只能應用在iOS而不能用于Mac,但是Quartz 2D是可以跨平臺的,因此在使用顏色時,不能直接使用UIColor而需要將顏色轉成CGColor

修改圖層相當于修改UIView屬性,即修改了界面屬性

形變屬性既可以用形變函數指定,也可以用keyPath指定

3.Layer中兩個非常重要的屬性:position 跟 anchor point

position:用來設置Layer在父層中的位置,以父層的左上角為原點

anchor point:決定著Layer身上的哪個點,會在position屬性所知的位置 ,取值范圍(0,1)


4.Layer的基本使用:設置UIView中的CALayer屬性

- (void)customViewLayer{

//1. 圓角? cornerRadius:指定圓角的半徑

self.MyView.layer.cornerRadius? = 5.0f;

//2. 陰影? coreAnimation是跨平臺的,基于QuatzCore框架,在coreAnimation中部哪呢過使用跟UI有關的方法,? 因為UIKit框架只能適用于IOS

// 要設置陰影除了顏色之外,還需要指定其他的參數: shadowRadius、 shadowOpacity、shadowOffset

self.MyView.layer.shadowColor? = [UIColor yellowColor].CGColor;

self.MyView.layer.shadowRadius? = 3.0f;

self.MyView.layer.shadowOpacity = 0.9f;

self.MyView.layer.shadowOffset? = CGSizeMake(0.0f, 0.0f);

//3. 邊框

self.MyView.layer.borderColor? = [UIColor whiteColor].CGColor;

self.MyView.layer.borderWidth? = 3.0f;

}

4. 設置UIImageView中的CALayer屬性

- (void)imageLayer{

//1. 在imageview中圖層不止一個,如果要設置圓角效果,需要設置一個跟隨屬性

self.MyImageView.layer.cornerRadius = 50.0f;

self.MyImageView.layer.masksToBounds = YES;

//2. 陰影

self.MyImageView.layer.shadowColor = [UIColor redColor].CGColor;

self.MyImageView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);

self.MyImageView.layer.shadowOpacity = 0.9f;

//3. 邊框

self.MyImageView.layer.borderWidth = 3.0f;

self.MyImageView.layer.borderColor = [UIColor orangeColor].CGColor;

}

4.1設置UIImageView中的CALayer的Transform屬性

//4. 形變屬性,在CALayer中是3D的

self.MyImageView.layer.transform = CATransform3DMakeTranslation(100.0f, 100.0f, 0.0f);

self.MyImageView.layer.transform = CATransform3DMakeScale(0.5f, 1.0f, 0.0f);

self.MyImageView.layer.transform = CATransform3DMakeRotation(M_PI_2, 0, 0, 1);

//5. 利用keyPath 設置形變? 可以將幾個屬性 組合使用

[self.MyImageView.layer setValue:@(100.0f) forKeyPath:@"transform.translation.x"];

[self.MyImageView.layer setValue:@(0.5f) forKeyPath:@"transform.scale.x"];

[self.MyImageView.layer setValue:@(M_PI_2) forKeyPath:@"transform.rotation.z"];

5.圖層和視圖之間的關系:

創建視圖對象時,視圖會自己創建一個層,視圖在繪圖(如drawRect:)時,會將內容畫在自己的層上。當視圖在層上完成繪圖后,系統會將圖層拷貝至屏幕。每個視圖都有一個層,而每個圖層又可以有多個子層

Layer的設計目的不是為了取代視圖,因此不能基于CALayer創建一個獨立的可視化組件

Layer的設計目的是提供視圖的基本可視內容,從而提高動畫的執行效率

除提供可視內容外,Layer不負責視圖的事件響應、內容繪制等工作,同時Layer不能參與到響應者鏈條中

6. 創建自定義圖層:

注意錨點和位置的關系,以及在旋轉轉換時對圖層的影響

//1. 自定義layer

CALayer *layer = [CALayer layer];

self.layer =layer;

[self.view.layer addSublayer:layer];

// 設置屬性

layer.bounds = CGRectMake(0, 0, 200, 200);

layer.backgroundColor = [UIColor orangeColor].CGColor;

// 設置中心點? ,默認對應的是中心點

layer.position = CGPointMake(0, 0);

// 設置內容

UIImage *image = [UIImage imageNamed:@"頭像1"];

layer.contents = (id)image.CGImage;

// 錨點,定位點

// 主要控制旋轉的軸,以及圖層的位置

// x = 圖層寬的比例

// y = 圖層高的比例

// 旋轉

layer.anchorPoint = CGPointMake(0, 0);

[self.layer setValue:@M_PI_4 forKeyPath:@"transform.rotation.z"];

6.CALayer的隱式動畫屬性:每一個UIView內部都默認關聯著一個CALayer,稱這個Layer為Root Layer。所有的非Root Layer都存在著隱式動畫,隱式動畫的默認時長為1/4秒。

如果要關閉默認的動畫效果,可以通過動畫事務方法實現:

[CATransaction begin];

[CATransaction setDisableActions:YES];

// ...

[CATransaction commit];

- (void)viewDidLoad {? ?

[super viewDidLoad];? ? ? ? //1. 自定義一個layer? ? CALayer *myLayer = [CALayer layer];? ?

myLayer.bounds = CGRectMake(0, 0, 100, 100);? ?

myLayer.backgroundColor = [UIColor redColor].CGColor;? ?

myLayer.position = CGPointMake(100, 100);?

? myLayer.anchorPoint = CGPointMake(0.5, 0.5);? ?

[self.view.layer addSublayer:myLayer];?

?self.myLayer = myLayer;}

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)even

{

UITouch *touch = touches.anyObject;

CGPoint location = [touch locationInView:self.view];

//位置

self.myLayer.position = location;

//透明度

CGFloat alpha = (arc4random_uniform(5) +1.0) / 10.0 +0.5;

self.myLayer.opacity = alpha;

//圓角

self.myLayer.cornerRadius = 5.0f;

// 設置旋轉角度

self.myLayer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

}

7.CALayer、UIView以及上下文之間的關系

當UIView收到setNeedsDisplay消息時,CALayer會準備好一個CGContextRef,然后向它的delegate即UIView,發送消息,并且傳入已經準備好的CGContextRef對象。UIView在drawLayer:inContext:方法中會調用自己的drawRect:方法

平時在drawRect:中通過UIGraphicsGetCurrentContext()獲取的就是由CALayer傳入的CGContextRef對象,在drawRect:中完成的所有繪圖都會填入CALayer的CGContextRef中,然后被拷貝至屏幕

CALayer的CGContextRef用的是位圖上下文(Bitmap Graphics Context)

所有的非Root Layer都存在著隱式動畫

8.CALayer根UIView選擇:

如果不需要根用戶進行交互,使用CALayer;因為它少了交互事件,性能比較高;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,141評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,572評論 6 30
  • 一、CAShapelayer 我們知道可以不使用圖片情況下利用CGpath去構建任意形狀的陰影。其實我們也可...
    小貓仔閱讀 1,516評論 0 5
  • 原文出處:http://blog.csdn.net/zhz459880251/article/details/50...
    F麥子閱讀 1,757評論 0 5
  • Core Animation是一個復合引擎,它的職責就是盡可能快地組合屏幕上不同的可視內容,這個內容是被分解成獨立...
    abb266389fd0閱讀 1,131評論 2 17