動畫—CALayer的初步學習一:CALayer屬性—隱式動畫(學會從博客上自學)

      在此先貼上我學習的參考博客:http://www.cnblogs.com/kenshincui/p/3972100.html

      CALayer基本介紹: 

         在iOS中CALayer的設計主要是了爲了內容展示和動畫操作,CALayer本身並不包含在UIKit中,它不能響應事件。由於CALayer在設計之初就考慮它的動畫操作功能,CALayer很多屬性在修改時都能形成動畫效果,這種屬性稱爲“隱式動畫屬性”。但是對於UIView的根圖層而言屬性的修改並不形成動畫效果,因爲很多情況下根圖層更多的充當容器的做用,如果它的屬性變動形成動畫效果會直接影響子圖層。另外,UIView的根圖層創建工作完全由iOS負責完成,無法重新創建,但是可以往根圖層中添加子圖層或移除子圖層。

     我的理解爲以下幾點:1.CALayer不能響應事件   2.CALayer很多屬性在修改時都能形成動畫效果,這種屬性還有一個名字——“隱式動畫屬性”   3.CALayer的根圖層而言,屬性的修改不能形成動畫   4.UIView的根圖層無法重新創建,但是可以添加(刪除)子圖層

   下表列出了CALayer常用的屬性:     

屬性  說明  是否支持隱式動畫 
anchorPoint 和中心點position重合的一個點,稱爲“錨點”,錨點的描述是相對於x、y位置比例而言的默認在圖像中心點(0.5,0.5)的位置
backgroundColor 圖層背景顏色 
borderColor 邊框顏色
borderWidth 邊框寬度
bounds 圖層大小
contents 圖層顯示內容,例如可以將圖片作爲圖層內容顯示
contentsRect 圖層顯示內容的大小和位置
cornerRadius 圓角半徑
doubleSided 圖層背面是否顯示,默認爲YES
frame 圖層大小和位置,不支持隱式動畫,所以CALayer中很少使用frame,通常使用bounds和position代替
hidden 是否隱藏
mask 圖層蒙版
maskToBounds 子圖層是否剪切圖層邊界,默認爲NO 是 
opacity 透明度 ,類似於UIView的alpha
position 圖層中心點位置,類似於UIView的center 
shadowColor 陰影顏色
shadowOffset 陰影偏移量
shadowOpacity 陰影透明度,注意默認爲0,如果設置陰影必須設置此屬性
shadowPath 陰影的形狀
shadowRadius 陰影模糊半徑
sublayers 子圖層
sublayerTransform 子圖層形變
transform 圖層形變
    anchorPoint屬性是圖層的錨點,範圍在(0~1,0~1)表示在x、y軸的比例,這個點永遠可以同position(中心點)重合,當圖層中心點固定後,調整anchorPoint即可達到調整圖層顯示位置的作用(因爲它永遠和position重合)

//
//  KCMainViewController.m
//  CALayer
//
//  Created by Kenshin Cui on 14-3-22.
//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#import "KCMainViewController.h"
#define WIDTH 50

@interface KCMainViewController ()

@end

@implementation KCMainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self drawMyLayer];
}

#pragma mark 繪製圖層
-(void)drawMyLayer{
    CGSize size=[UIScreen mainScreen].bounds.size;
    
    //獲得根圖層
    CALayer *layer=[[CALayer alloc]init];
    //設置背景顏色,由於QuartzCore是跨平臺框架,無法直接使用UIColor
    layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor;
    //設置中心點
    layer.position=CGPointMake(size.width/2, size.height/2);
    //設置大小
    layer.bounds=CGRectMake(0, 0, WIDTH,WIDTH);
    //設置圓角,當圓角半徑等於矩形的一半時看起來就是一個圓形
    layer.cornerRadius=WIDTH/2;
    //設置陰影
    layer.shadowColor=[UIColor grayColor].CGColor;
    layer.shadowOffset=CGSizeMake(2, 2);
    layer.shadowOpacity=.9;
    //設置邊框
//    layer.borderColor=[UIColor whiteColor].CGColor;
//    layer.borderWidth=1;

    //設置錨點
//    layer.anchorPoint=CGPointZero;

    [self.view.layer addSublayer:layer];

}

#pragma mark 點擊放大
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch=[touches anyObject];
    CALayer *layer=self.view.layer.sublayers[0];
    CGFloat width=layer.bounds.size.width;
    if (width==WIDTH) {
        width=WIDTH*4;
    }else{
        width=WIDTH;
    }
    layer.bounds=CGRectMake(0, 0, width, width);
    layer.position=[touch locationInView:self.view];
    layer.cornerRadius=width/2;
}
@end

    按照他的敲,運行:發現了一個問題:沒有反應

   於是,我在if(width== WIDTH)和else兩個地方設置了斷點,並且打印了width的值,打印了self.view.layer.sublayers:也就是所有兒子,我發現一個奇怪的問題,width爲0,這很奇怪,而且self.view.sublayers有三個對象,這就讓我想要測試一下,我把self.view.layer.sublayers[0]中的0變成1,2試了一試,發現http://blog.csdn.net/wscqqlucy/article/details/84432362有反應。這個是我的一個疑問,self.view.layer 我就add了一個layer啊,所以他自己應該也有layer,哪是那些layer呢?

     於是看了另一個博客:http://blog.csdn.net/wscqqlucy/article/details/8443236 ,看了好久看到這麼一句話:

當你用 addSublayer 來添加一個子圖層時,他會被添加到圖層層次結構的頂層,所以他會顯示在現有所有子圖層的最前面。用一組名爲 insertSublayer 的替代方法,你可以將新視圖插入現有的圖層之間。

    這個說明沒有加layer的時候,他自己就有兩個layer,所以add 自己創建的這個layer的時候,這個layer變成了最外面的這個。至於這兩個到底是哪兩個,我敢肯定的是其中一個肯定是self.view.layer。

      這段代碼是動態改變了layer屬性中的bounds和position,是“隱身動畫屬性”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章