你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟中CALayer應用的根本教程

iOS開辟中CALayer應用的根本教程

編輯:IOS開發綜合

1、簡略引見
在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擔任完成,沒法從新創立,然則可以往根圖層中添加子圖層或移除子圖層。

 

2、簡略應用

  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中新添加一張圖片。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615444353.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)

【iOS開辟中CALayer應用的根本教程】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved