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;因為它少了交互事件,性能比較高;