CALayer

1悼枢、CALayer簡(jiǎn)單介紹

1馒索、在iOS中旨怠,你能看得見(jiàn)摸得著的東西基本上都是UIView蜈块,比如一個(gè)按鈕鉴腻、一個(gè)文本標(biāo)簽、一個(gè)文本輸入框百揭、一個(gè)圖標(biāo)等等爽哎,這些都是UIView

其實(shí)UIView之所以能顯示在屏幕上,完全是因?yàn)樗鼉?nèi)部的一個(gè)圖層

在創(chuàng)建UIView對(duì)象時(shí)器一,UIView內(nèi)部會(huì)自動(dòng)創(chuàng)建一個(gè)圖層(即CALayer對(duì)象)课锌,通過(guò)UIView的layer屬性可以訪問(wèn)這個(gè)層

@property(nonatomic,readonly,retain) CALayer*layer; 

當(dāng)UIView需要顯示到屏幕上時(shí),會(huì)調(diào)用drawRect:方法進(jìn)行繪圖祈秕,并且會(huì)將所有內(nèi)容繪制在自己的圖層上渺贤,繪圖完畢后,系統(tǒng)會(huì)將圖層拷貝到屏幕上请毛,于是就完成了UIView的顯示
換句話說(shuō)获印,UIView本身不具備顯示的功能,是它內(nèi)部的層才有顯示功能

通過(guò)操作CALayer對(duì)象,可以很方便地調(diào)整UIView的一些外觀屬性,比如:陰影【如果設(shè)置了超過(guò)主圖層的部分減掉,則設(shè)置陰影不會(huì)有顯示效果;設(shè)置陰影墨吓,不光需要設(shè)置陰影顏色秘症,還應(yīng)該設(shè)置陰影的偏移位和透明度趟卸。因?yàn)槿绻辉O(shè)置偏移位的話邻邮,那么陰影和layer完全重疊鸭蛙,且默認(rèn)透明度為0(即完全透明)】肪获、圓角大小青柄、邊框?qū)挾群皖伾⑦€可以給圖層添加動(dòng)畫(huà),來(lái)實(shí)現(xiàn)一些比較炫酷的效果等等

2膏斤、CALayer是定義在QuartzCore框架中的沮榜,CGImageRef型酥、CGColorRef兩種數(shù)據(jù)類型是定義在CoreGraphics框架中的;UIColor拒担、UIImage是定義在UIKit框架中的
QuartzCore框架和CoreGraphics框架是可以跨平臺(tái)使用的,在iOS和MacOS X上都能使用(C語(yǔ)言編寫(xiě))但是UIKit只能在iOS中使用(Objective-C)
為了保證可移植性,QuartzCore不能使用UIImage最蕾、UIColor慷嗜,只能使用CGImageRef洪添、CGColorRef導(dǎo)入其他框架的方式: 選中項(xiàng)目, 在General中找 Linked Frameworks and Libraries添加對(duì)應(yīng)的框架

2、UIView和CALayer之間的區(qū)別

1、UIView是用來(lái)顯示內(nèi)容的,可以處理用戶事件刁愿。直接繼承UIResponser脑题。
2凿叠、CALayer是用來(lái)繪制內(nèi)容的,不能處理用戶事件片吊。直接集成NSObject绽昏。
3、 UIView和CALayer是相互依賴的關(guān)系俏脊。UIView依賴于calayer提供的內(nèi)容全谤,CALayer依賴UIView提供的容器來(lái)顯示繪制的內(nèi)容。歸根到底CALayer是這一切的基礎(chǔ)爷贫,如果沒(méi)有CALayer认然,UIView自身也不會(huì)存在,UIView是一個(gè)特殊的CALayer實(shí)現(xiàn)漫萄,添加了響應(yīng)事件的能力卷员。兩者之間是依存的關(guān)系.UIView可以通過(guò)subviews屬性訪問(wèn)所有的子視圖,類似地腾务,CALayer也可以通過(guò)sublayers屬性訪問(wèn)所有的子層毕骡; UIView可以通過(guò)superview屬性訪問(wèn)父視圖,類似地岩瘦,CALayer也可以通過(guò)superlayer屬性訪問(wèn)父層未巫。如果一個(gè)控件是另外一個(gè)控件的子控件,那么這個(gè)控件的layer也是另一個(gè)控件的子layer
結(jié)論:UIView來(lái)自CALayer启昧,高于CALayer橱赠,是CALayer高層實(shí)現(xiàn)與封裝。UIView的所有特性來(lái)源于CALayer支持箫津。

3狭姨、CALayer的常用屬性

寬度和高度
@property CGRect bounds;

位置(默認(rèn)指中點(diǎn)宰啦,具體由anchorPoint決定)
@property CGPoint position;

錨點(diǎn)(x,y的范圍都是0-1),決定了position的含義
@property CGPoint anchorPoint;

背景顏色(CGColorRef類型)
@propertyCGColorRefbackgroundColor;

形變屬性
@property CATransform3D transform;

邊框顏色(CGColorRef類型)
@property  CGColorRef  borderColor;

邊框?qū)挾?@property CGFloat borderWidth;

圓角半徑
@property CGFloat cornerRadius;

內(nèi)容(比如設(shè)置為圖片CGImageRef)
@property(retain) id contents;

說(shuō)明:可以通過(guò)設(shè)置contents屬性給UIView設(shè)置背景圖片

self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"123"].CGImage);  跨框架賦值需要進(jìn)行橋接

4饼拍、代碼示例

4.1CALayer的陰影效果

#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)  CALayer *myLayer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 添加到控制器的視圖之中
    [self.view.layer addSublayer:self.myLayer];
    
    // 設(shè)置圖層的內(nèi)容
    self.myLayer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"123"].CGImage);
    // 設(shè)置陰影的顏色
    self.myLayer.shadowColor = [UIColor blackColor].CGColor;
    // 設(shè)置陰影的便宜
    self.myLayer.shadowOffset = CGSizeMake(15, 10);
    // 設(shè)置陰影的不透明度
    self.myLayer.shadowOpacity = 0.6;
    // 設(shè)置邊角半徑
    self.myLayer.cornerRadius = 15;
    // 設(shè)置裁剪
    self.myLayer.masksToBounds = YES;
    // 設(shè)置邊框線的顏色
    self.myLayer.borderColor = [UIColor blackColor].CGColor;
    // 設(shè)置邊框線條的寬度
    self.myLayer.borderWidth = 5.0;
}
-(CALayer *)myLayer{

    if (_myLayer ==nil) {
        // 創(chuàng)建layer對(duì)象
        _myLayer = [CALayer layer];
        // 設(shè)置圖層的frame
        _myLayer.frame = CGRectMake(50, 100, 190, 145);
        // 設(shè)置背景顏色
        _myLayer.backgroundColor = [UIColor blackColor].CGColor;
        
        self.myLayer = _myLayer;
    }
    return _myLayer;
}
@end

4.1運(yùn)行效果

Snip20161106_1.png

設(shè)置陰影效果和裁剪邊角的效果是沖突的赡模,如果設(shè)置裁剪邊角那么陰影效果無(wú)法實(shí)現(xiàn);當(dāng)注釋掉裁剪邊框的效果师抄,陰影效果才顯示

Snip20161106_2.png

4.2position和anchorPoint屬性

CALayer有2個(gè)非常重要的屬性:position和anchorPoint

@property CGPoint position;

用來(lái)設(shè)置CALayer在父層中的位置

以父層的左上角為原點(diǎn)(0, 0)

@property CGPoint anchorPoint;稱為“定位點(diǎn)”漓柑、“錨點(diǎn)”
決定著CALayer身上的哪個(gè)點(diǎn)會(huì)在position屬性所指的位置
以自己的左上角為原點(diǎn)(0, 0),它的x叨吮、y取值范圍都是0~1辆布,默認(rèn)值為(0.5, 0.5)


#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong)  CALayer *myLayer;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    [self.view.layer addSublayer:self.myLayer];
   
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    self.myLayer.anchorPoint = CGPointMake(0, 0);

}
-(CALayer *)myLayer{
    if (_myLayer ==nil) {
        _myLayer = [CALayer layer];
        _myLayer.frame = CGRectMake(100, 100, 100, 100);
        _myLayer.backgroundColor = [UIColor redColor].CGColor;
        self.myLayer = _myLayer;
    }
    return _myLayer;
}
@end
Untitled.gif

4.3隱式動(dòng)畫(huà)

每一個(gè)UIView內(nèi)部都默認(rèn)關(guān)聯(lián)著一個(gè)CALayer,我們可稱這個(gè)Layer為RootLayer(根層)
所有的非RootLayer茶鉴,也就是手動(dòng)創(chuàng)建的CALayer對(duì)象锋玲,都存在著隱式動(dòng)畫(huà)
什么是隱式動(dòng)畫(huà)?
當(dāng)對(duì)非RootLayer的部分屬性進(jìn)行修改時(shí)涵叮,默認(rèn)會(huì)自動(dòng)產(chǎn)生一些動(dòng)畫(huà)效果而這些屬性稱為AnimatableProperties(可動(dòng)畫(huà)屬性)

列舉幾個(gè)常見(jiàn)的AnimatableProperties:
bounds:用于設(shè)置CALayer的寬度和高度惭蹂。修改這個(gè)屬性會(huì)產(chǎn)生縮放動(dòng)畫(huà)
backgroundColor:用于設(shè)置CALayer的背景色。修改這個(gè)屬性會(huì)產(chǎn)生背景色的漸變動(dòng)畫(huà)
position:用于設(shè)置CALayer的位置割粮。修改這個(gè)屬性會(huì)產(chǎn)生平移動(dòng)畫(huà)
?
可以通過(guò)動(dòng)畫(huà)事務(wù)(CATransaction)關(guān)閉默認(rèn)的隱式動(dòng)畫(huà)效果

[CATransactionbegin];
[CATransactionsetDisableActions:YES];
self.myview.layer.position= CGPointMake(10, 10);
[CATransactioncommit];
#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong)  CALayer *myLayer;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    [self.view.layer addSublayer:self.myLayer];
   
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    // 關(guān)閉隱式動(dòng)畫(huà)
    self.myLayer.anchorPoint = CGPointMake(0, 0);
    // 執(zhí)行動(dòng)畫(huà)事務(wù)
    [CATransaction commit];
}
-(CALayer *)myLayer{
    if (_myLayer ==nil) {
        _myLayer = [CALayer layer];
        _myLayer.frame = CGRectMake(100, 100, 100, 100);
        _myLayer.backgroundColor = [UIColor redColor].CGColor;
        self.myLayer = _myLayer;
    }
    return _myLayer;
}
@end

效果圖

Untitled.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盾碗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舀瓢,更是在濱河造成了極大的恐慌廷雅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件京髓,死亡現(xiàn)場(chǎng)離奇詭異榜轿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)朵锣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)谬盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诚些,你說(shuō)我怎么就攤上這事飞傀。” “怎么了诬烹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砸烦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绞吁,道長(zhǎng)幢痘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任家破,我火速辦了婚禮颜说,結(jié)果婚禮上购岗,老公的妹妹穿的比我還像新娘。我一直安慰自己门粪,他們只是感情好喊积,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著玄妈,像睡著了一般乾吻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拟蜻,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天绎签,我揣著相機(jī)與錄音,去河邊找鬼酝锅。 笑死诡必,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屈张。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袱巨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阁谆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起愉老,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤场绿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嫉入,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體焰盗,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年咒林,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熬拒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垫竞,死狀恐怖澎粟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欢瞪,我是刑警寧澤活烙,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站遣鼓,受9級(jí)特大地震影響啸盏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骑祟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一回懦、第九天 我趴在偏房一處隱蔽的房頂上張望气笙。 院中可真熱鬧,春花似錦粉怕、人聲如沸健民。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秉犹。三九已至,卻和暖如春稚晚,著一層夾襖步出監(jiān)牢的瞬間崇堵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工客燕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸳劳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓也搓,卻偏偏與公主長(zhǎng)得像赏廓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子傍妒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果幔摸,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫(huà)全貌颤练。在這里你可以看...
    每天刷兩次牙閱讀 8,485評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果既忆,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫(huà)全貌嗦玖。在這里你可以看...
    F麥子閱讀 5,110評(píng)論 5 13
  • 概覽 在iOS中隨處都可以看到絢麗的動(dòng)畫(huà)效果宇挫,實(shí)現(xiàn)這些動(dòng)畫(huà)的過(guò)程并不復(fù)雜苛吱,今天將帶大家一窺iOS動(dòng)畫(huà)全貌。在這里你...
    被吹落的風(fēng)閱讀 1,563評(píng)論 1 2
  • 轉(zhuǎn)載:http://www.cnblogs.com/jingdizhiwa/p/5601240.html 1.ge...
    F麥子閱讀 1,544評(píng)論 0 1
  • 原文出處:http://blog.csdn.net/zhz459880251/article/details/50...
    F麥子閱讀 1,739評(píng)論 0 5