1. 程式人生 > >iOS開發 - CALayer圖層

iOS開發 - CALayer圖層

bridge os x contents idg int set with hdu pre

CALayer的基本使用

在iOS中。你能看得見摸得著的東西基本上都是UIView。比方一個button、一個文本標簽、一個文本輸入框、一個圖標等等。這些都是UIView

事實上UIView之所以能顯示在屏幕上,全然是由於它內部的一個圖層

在創建UIView對象時,UIView內部會自己主動創建一個圖層(即CALayer對象)。通過UIView的layer屬性能夠訪問這個層
@property(nonatomic,readonly,retain) CALayer *layer;

當UIView須要顯示到屏幕上時,會調用drawRect:方法進行畫圖,而且會將全部內容繪制在自己的圖層上,畫圖完畢後,系統會將圖層復制到屏幕上,於是就完畢了UIView的顯示

換句話說,UIView本身不具備顯示的功能,是它內部的層才有顯示功能

通過操作CALayer對象,能夠非常方便地調整UIView的一些外觀屬性,比方:
陰影
圓角大小
邊框寬度和顏色
… …

還能夠給圖層加入動畫,來實現一些比較炫酷的效果

CALayer的屬性

//寬度和高度
@property CGRect bounds;
//位置(默認指中點。詳細由anchorPoint決定)
@property CGPoint position;
//錨點(x,y的範圍都是0-1)。決定了position的含義
@property CGPoint anchorPoint;
//背景顏色(CGColorRef類型)
@property CGColorRef backgroundColor; //形變屬性 @property CATransform3D transform;
//邊框顏色(CGColorRef類型)
@property CGColorRef borderColor;

//邊框寬度
@property CGFloat borderWidth;

//圓角半徑
@property CGFloat cornerRadius;

//內容(比方設置為圖片CGImageRef)
@property(retain) id contents;

關於CALayer的疑惑

首先
CALayer是定義在QuartzCore框架中的(Core Animation)
CGImageRef、CGColorRef兩種數據類型是定義在CoreGraphics框架中的
UIColor、UIImage是定義在UIKit框架中的

其次
QuartzCore框架和CoreGraphics框架是能夠跨平臺使用的,在iOS和Mac OS X上都能使用
可是UIKit僅僅能在iOS中使用

為了保證可移植性,QuartzCore不能使用UIImage、UIColor,僅僅能使用CGImageRef、CGColorRef

UIView和CALayer的選擇

通過CALayer,就能做出跟UIView一樣的界面效果

既然CALayer和UIView都能實現同樣的顯示效果,那到底該選擇誰好呢?
事實上,對照CALayer,UIView多了一個事件處理的功能。

也就是說。CALayer不能處理用戶的觸摸事件。而UIView能夠
所以,假設顯示出來的東西須要跟用戶進行交互的話,用UIView;假設不須要跟用戶進行交互,用UIView或者CALayer都能夠
當然。CALayer的性能會高一些,由於它少了事件處理的功能,更加輕量級

position和anchorPoint介紹

//CALayer有2個非常重要的屬性:position和anchorPoint

@property CGPoint position;
用來設置CALayer在父層中的位置
以父層的左上角為原點(0, 0)

@property CGPoint anchorPoint;
稱為“定位點”、“錨點”
決定著CALayer身上的哪個點會在position屬性所指的位置
以自己的左上角為原點(0, 0)
它的x、y取值範圍都是0~1,默認值為(0.5, 0.5),意味著錨點在layer的中間

anchorPoint(示意圖)

技術分享

position和anchorPoint

技術分享

隱式動畫

每個UIView內部都默認關聯著一個CALayer,我們可用稱這個Layer為Root Layer(根層)

全部的非Root Layer。也就是手動創建的CALayer對象。都存在著隱式動畫

什麽是隱式動畫?
當對非Root Layer的部分屬性進行改動時。默認會自己主動產生一些動畫效果
而這些屬性稱為Animatable Properties(可動畫屬性)

列舉幾個常見的Animatable Properties:
bounds:用於設置CALayer的寬度和高度。改動這個屬性會產生縮放動畫
backgroundColor:用於設置CALayer的背景色。改動這個屬性會產生背景色的漸變動畫
position:用於設置CALayer的位置。改動這個屬性會產生平移動畫

//能夠通過動畫事務(CATransaction)關閉默認的隱式動畫效果
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];

CALayer圖層實例


@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *redView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [UIView animateWithDuration:1 animations:^{

         //縮放
        _imageView.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);

         //平移
        _imageView.layer.transform = CATransform3DMakeTranslation(200, 200, 0);

         //縮放
        _imageView.layer.transform = CATransform3DMakeScale(1, 0.5, 1);

     //利用KVC改變形變
     NSValue *rotation = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)];

        [_imageView.layer setValue:rotation forKeyPath:@"transform"];

        [_imageView.layer setValue:@M_PI forKeyPath:@"transform.rotation"];

        [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];

        // 平移x軸
        [_imageView.layer setValue:@200 forKeyPath:@"transform.translation.x"];


    }];
}

- (void)imageLayer
{
    // 圓形裁剪
    _imageView.layer.cornerRadius = 50;

    // 超出layer邊框的全部裁剪掉
    _imageView.layer.masksToBounds = YES;

    _imageView.layer.borderColor = [UIColor whiteColor].CGColor;
    _imageView.layer.borderWidth = 2;
}

- (void)viewLayer
{
    // 設置陰影透明度
    _redView.layer.shadowOpacity = 1;

    // 設置陰影顏色
    _redView.layer.shadowColor = [UIColor yellowColor].CGColor;

    // 設置陰影圓角半徑
    _redView.layer.shadowRadius = 10;

    // 設置圓角半徑
    _redView.layer.cornerRadius = 50;

    // 設置邊框半徑
    _redView.layer.borderColor = [UIColor whiteColor].CGColor;

    // 設置邊框半徑
    _redView.layer.borderWidth = 2;
}

@end

自己定義塗層

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 創建一個圖層
    CALayer *layer = [CALayer layer];

    // 設置尺寸
    layer.bounds = CGRectMake(0, 0, 100, 100);

    // 設置位置
    layer.position = CGPointMake(100, 100);

    // 設置顏色
    layer.backgroundColor = [UIColor redColor].CGColor;

    // 設置內容
    layer.contents = (__bridge id)[UIImage imageNamed:@"picture.png"].CGImage;


    [self.view.layer addSublayer:layer];

}
@end

iOS開發 - CALayer圖層