亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發中CALayer使用的基本教程

2020-07-26 03:31:52
字體:
來源:轉載
供稿:網友

一、簡單介紹
在iOS中,你能看得見摸得著的東西基本上都是UIView,比如一個按鈕、一個文本標簽、一個文本輸入框、一個圖標等等,這些都是UIView。

其實UIView之所以能顯示在屏幕上,完全是因為它內部的一個圖層,在創建UIView對象時,UIView內部會自動創建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層

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

當UIView需要顯示到屏幕上時,會調用drawRect:方法進行繪圖,并且會將所有內容繪制在自己的圖層上,繪圖完畢后,系統會將圖層拷貝到屏幕上,于是就完成了UIView的顯示

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

CALayer包含在QuartzCore框架中,這是一個跨平臺的框架,既可以用在iOS中又可以用在Mac OS X中。在使用Core Animation開發動畫的本質就是將CALayer中的內容轉化為位圖從而供硬件操作,所以要熟練掌握動畫操作必須先來熟悉CALayer。

UIView是iOS系統中界面元素的基礎,所有的界面元素都繼承自它。它本身完全是由CoreAnimation來實現的(Mac下似乎不是這樣)。它真正的繪圖部分,是由一個叫CALayer(Core Animation Layer)的類來管理。UIView本身,更像是一個CALayer的管理器,訪問它的跟繪圖和跟坐標有關的屬性,例如frame,bounds等等,實際上內部都是在訪問它所包含的CALayer的相關屬性。

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

 

二、簡單使用

  UIView之所以能夠顯示,完全是因為內部的CALayer對象。因此,通過操作這個CALayer對象,可以很方便地調整UIView的一些界面屬性,比如:陰影、圓角大小、邊框寬度和顏色等。

  新建一個項目,在storyboard中添加一個view.

20151121100707550.png (648×190)

1.通過layer設置邊框的寬度和顏色

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIView *customView;

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //設置邊框的寬度為20
    self.customView.layer.borderWidth=20;
    //設置邊框的顏色
    self.customView.layer.borderColor=[UIColor greenColor].CGColor;
}

@end


20151121100731185.png (264×184)

2.通過layer設置邊框為圓角

復制代碼 代碼如下:

//設置layer的圓角
self.customView.layer.cornerRadius=20;

20151121100748300.png (199×159)

3.在layer上添加一張圖片

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIView *customView;

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //設置邊框的寬度為20
    self.customView.layer.borderWidth=5;
    //設置邊框的顏色
    self.customView.layer.borderColor=[UIColor blackColor].CGColor;
   
    //設置layer的圓角
    self.customView.layer.cornerRadius=20;
   
    //在view的圖層上添加一個image,contents表示接受內容
    self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
   
}
@end


20151121100806053.png (244×204)

說明:contents是id類型,可以接受內容,上面的實例讓layer顯示一張圖片,仔細觀察可以發現四個圓角的部分露了一個角出來。

產生的原因說明:

20151121100828974.png (450×236)

customview上的根layer

20151121100850507.png (227×190)

UIimage的圖層

20151121100911863.png (492×200)

添加后

20151121100934564.png (378×194)

那是因為設置的image不是展示在主圖層上的,而是顯示在子圖層上的??梢酝ㄟ^設置一個范圍,設置超出主圖層的部分把它給剪切掉。

有以下兩種方法,建議使用layer中的方法(第二種)self.customView.layer.masksToBounds=YES;

復制代碼 代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //設置邊框的寬度為20
    self.customView.layer.borderWidth=5;
    //設置邊框的顏色
    self.customView.layer.borderColor=[UIColor blackColor].CGColor;
   
    //設置layer的圓角
    self.customView.layer.cornerRadius=20;
    //設置超過子圖層的部分裁減掉
    //UI框架中使用的方法
//    self.customView.clipsToBounds=YES;
    self.customView.layer.masksToBounds=YES;
   
    //在view的圖層上添加一個image,contents表示接受內容
    self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
}

20151121101021821.png (214×176)

注意:layer中不能直接接受UI框架中的東西

4.設置陰影

  設置陰影,不光需要設置陰影顏色,還應該設置陰影的偏移位和透明度。

  因為如果不設置偏移位的話,那么陰影和layer完全重疊,且默認透明度為0(即完全透明)。

復制代碼 代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //設置陰影的顏色
    self.customView.layer.shadowColor=[UIColor blackColor].CGColor;
    //設置陰影的偏移量,如果為正數,則代表為往右邊偏移
    self.customView.layer.shadowOffset=CGSizeMake(15, 5);
    //設置陰影的透明度(0~1之間,0表示完全透明)
    self.customView.layer.shadowOpacity=0.6;
}

20151121101042439.png (202×177)

補充說明:如果設置了超過主圖層的部分減掉,則設置陰影不會有顯示效果。/

復制代碼 代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //設置邊框的寬度為20
    self.customView.layer.borderWidth=5;
    //設置邊框的顏色
    self.customView.layer.borderColor=[UIColor blackColor].CGColor;
   
    //設置layer的圓角
    self.customView.layer.cornerRadius=20;
    //設置超過子圖層的部分裁減掉
    //UI框架中使用的方法
    //    self.customView.clipsToBounds=YES;
    self.customView.layer.masksToBounds=YES;
   
    //在view的圖層上添加一個image,contents表示接受內容
    self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
   
    //設置陰影的顏色
    self.customView.layer.shadowColor=[UIColor blackColor].CGColor;
    //設置陰影的偏移量,如果為正數,則代表為往右邊偏移
    self.customView.layer.shadowOffset=CGSizeMake(15, 5);
    //設置陰影的透明度(0~1之間,0表示完全透明)
    self.customView.layer.shadowOpacity=0.6;
}


20151121101101342.png (170×151)

把剪切超出主圖層部分的代碼注釋掉之后的顯示效果

復制代碼 代碼如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //設置邊框的寬度為20
    self.customView.layer.borderWidth=5;
    //設置邊框的顏色
    self.customView.layer.borderColor=[UIColor blackColor].CGColor;
   
    //設置layer的圓角
    self.customView.layer.cornerRadius=20;
    //設置超過子圖層的部分裁減掉
    //UI框架中使用的方法
    //    self.customView.clipsToBounds=YES;
//    self.customView.layer.masksToBounds=YES;
   
    //在view的圖層上添加一個image,contents表示接受內容
    self.customView.layer.contents=(id)[UIImage imageNamed:@"me"].CGImage;
   
    //設置陰影的顏色
    self.customView.layer.shadowColor=[UIColor blackColor].CGColor;
    //設置陰影的偏移量,如果為正數,則代表為往右邊偏移
    self.customView.layer.shadowOffset=CGSizeMake(15, 5);
    //設置陰影的透明度(0~1之間,0表示完全透明)
    self.customView.layer.shadowOpacity=0.6;
}

20151121101119810.png (194×151)

5.只要繼承自uiview的都有layer屬性,下面以圖片為例進行說明。

在storyboard中新添加一張圖片。

20151121101135207.png (615×307)

簡單設置示例

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIView *customView;
@property (weak, nonatomic) IBOutlet UIImageView *iconView;

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //設置圖片layer的邊框寬度和顏色
    self.iconView.layer.borderColor=[UIColor brownColor].CGColor;
    self.iconView.layer.borderWidth=5;
   
    //設置layer的圓角
    self.iconView.layer.cornerRadius=20;
    //設置超過子圖層的部分裁減掉
       self.iconView.layer.masksToBounds=YES;
}


20151121101152087.png (251×276)

設置bounds屬性,在設置時需要去除掉storyboard中的自動布局屬性。

20151121101208890.png (555×288)

設置圖片的形變屬性(transform)

復制代碼 代碼如下:

@implementation YYViewController

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

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    //通過uiview設置(2D效果)
//    self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
    //通過layer來設置(3D效果,x,y,z三個方向)
    self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
}


通過uiview設置(2D效果)

20151121101226190.png (647×180)

通過layer設置(3D效果)

20151121101245848.png (435×125)

使用KVC進行設置

復制代碼 代碼如下:

#import "YYViewController.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIView *customView;
@property (weak, nonatomic) IBOutlet UIImageView *iconView;

@end


復制代碼 代碼如下:

@implementation YYViewController

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

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    //通過uiview設置(2D效果)
//    self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
    //通過layer來設置(3D效果,x,y,z三個方向)
//    self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
   
    //通過KVC來設置
    NSValue *v=[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(100, 20, 0)];
    [self.iconView.layer setValue:v forKeyPath:@"transform"];
    //如果是只需要設置在某一個方向上的移動,可以參考下面的代碼
    //在x的方向上向左移動100
    [self.iconView.layer setValue:@(-100) forKeyPath:@"transform.translation.x"];
}


查看蘋果的官方文檔,下面的屬性都可以通過KVC進行設置。

20151121101304152.png (1206×507)

旋轉一個弧度

復制代碼 代碼如下:

@implementation YYViewController

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

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    //通過uiview設置(2D效果)
//    self.iconView.transform=CGAffineTransformMakeTranslation(0, -100);
    //通過layer來設置(3D效果,x,y,z三個方向)
//    self.iconView.layer.transform=CATransform3DMakeTranslation(100, 20, 0);
   
    //通過KVC來設置
//    NSValue *v=[NSValue valueWithCATransform3D:CATransform3DMakeTranslation(100, 20, 0)];
//    [self.iconView.layer setValue:v forKeyPath:@"transform"];
//    //如果是只需要設置在某一個方向上的移動,可以參考下面的代碼
//    //在x的方向上向左移動100
//    [self.iconView.layer setValue:@(-100) forKeyPath:@"transform.translation.x"];
   
    //旋轉
    self.iconView.layer.transform=CATransform3DMakeRotation(M_PI_4, 1, 1, 0.5);
}


20151121101326981.png (220×191)

補充:三維坐標系

20151121101343343.png (672×505)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品视频99| 狠狠躁18三区二区一区| 91社影院在线观看| 韩剧1988免费观看全集| 午夜剧场成人观在线视频免费观看| 欧美黑人国产人伦爽爽爽| 亚洲精品国产suv| 亚洲欧洲激情在线| 亚洲第一视频网站| 97在线视频观看| 欧美国产在线电影| 欧美最近摘花xxxx摘花| 国产精品一区二区在线| 国产一区二区三区在线观看网站| 久久999免费视频| 日韩中文在线观看| 久久精品视频一| 亚洲www在线观看| 色系列之999| 欧美一区二区影院| 国产欧美韩国高清| 欧美激情va永久在线播放| 日韩综合视频在线观看| 久久99热精品| 国产精品女人网站| www.欧美视频| 精品国产乱码久久久久酒店| 国产精品7m视频| 亚洲国产精品久久精品怡红院| 亚洲第一区在线| 精品国产一区久久久| 91在线观看免费高清完整版在线观看| 国产精品男人爽免费视频1| 欧美成人小视频| 国产午夜精品全部视频播放| 国产精品色婷婷视频| 欧美夫妻性生活xx| 成人黄色在线播放| 亚洲成色www8888| 狠狠躁18三区二区一区| 日韩美女视频免费看| 性欧美xxxx视频在线观看| 国产97在线|亚洲| 91亚洲精品一区二区| 久久人体大胆视频| 777国产偷窥盗摄精品视频| 国产97在线|日韩| 成人黄色av播放免费| 国产精品久久久久久久久男| 午夜精品一区二区三区在线视| 日韩大陆毛片av| 一区二区欧美激情| 亚洲18私人小影院| 午夜精品久久久久久久久久久久| 日韩中文字幕第一页| 欧美在线性视频| 亚洲精品视频在线播放| 57pao成人永久免费视频| 亚洲最大av网| 国产精品视频1区| 久久久久久久av| 亚洲国产女人aaa毛片在线| 日韩一区二区三区xxxx| 狠狠躁天天躁日日躁欧美| 欧美亚洲另类在线| 欧美激情视频给我| 亚洲精品国产电影| 亚洲xxx自由成熟| 欧美极品美女电影一区| 色综合天天综合网国产成人网| 欧美黄网免费在线观看| 亚洲国产精品女人久久久| 青青精品视频播放| 欧美亚洲成人免费| 欧美精品在线视频观看| 亚洲成av人影院在线观看| 日韩欧美黄色动漫| 91禁国产网站| 亚洲一区精品电影| 亚洲精品视频网上网址在线观看| 欧美日韩国产限制| 欧美www视频在线观看| 国产欧美在线观看| 欧美成人免费va影院高清| 狠狠干狠狠久久| 久久久久久久久综合| 日本精品久久久久影院| 国产精品99久久久久久白浆小说| 亚洲精品日韩av| 色播久久人人爽人人爽人人片视av| 91精品视频免费| 欧美国产精品日韩| 亚洲国内高清视频| 精品国产一区二区三区四区在线观看| 亚洲成人网久久久| 久久精品国产清自在天天线| 欧洲成人性视频| 日韩中文字幕在线精品| 成人日韩av在线| 亚洲成av人片在线观看香蕉| 精品国产一区二区三区久久狼5月| 亚洲国产古装精品网站| 91国产高清在线| 欧美一级高清免费| 91在线国产电影| 91精品在线播放| 国产精品三级久久久久久电影| 精品性高朝久久久久久久| 日韩亚洲成人av在线| 国外成人性视频| 国产精品久久久久久av下载红粉| 欧美激情性做爰免费视频| 色99之美女主播在线视频| 日韩一二三在线视频播| 欧美视频一区二区三区…| 欧美尺度大的性做爰视频| 国内精品小视频| 亚洲欧美日韩天堂一区二区| 亚洲成人av资源网| 亚洲欧洲免费视频| 欧美大片免费观看在线观看网站推荐| 成人女保姆的销魂服务| 韩国福利视频一区| 亚洲福利在线观看| 国产啪精品视频网站| 欧美综合国产精品久久丁香| 亚洲美女在线视频| 亚洲综合社区网| 日韩大片免费观看视频播放| 黑人欧美xxxx| 日韩精品极品毛片系列视频| 亚洲天堂av在线免费| 高跟丝袜欧美一区| 国产专区欧美专区| 亚洲天堂久久av| 欧美噜噜久久久xxx| 国产精品成av人在线视午夜片| 国产在线观看91精品一区| 中文字幕国产亚洲2019| 国产ts一区二区| 26uuu另类亚洲欧美日本老年| 日韩免费黄色av| 亚洲3p在线观看| 18一19gay欧美视频网站| 两个人的视频www国产精品| 久久久精品电影| 久久久久久久香蕉网| 日本不卡高字幕在线2019| 精品久久久久久久久国产字幕| 国产精品日韩久久久久| 51ⅴ精品国产91久久久久久| 国产激情综合五月久久| 欧美午夜激情小视频| 最新国产精品亚洲| 欧美成人激情视频| 一区二区三区回区在观看免费视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品爱久久久久久久| 日韩极品精品视频免费观看| 国产99视频在线观看| 一本色道久久88综合亚洲精品ⅰ| 欧美裸体视频网站| 亚洲男人7777| 国产精选久久久久久|