一:CATransform3D
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageV; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } /** * 1:要想產生3D動畫,則必須操作layear圖層,self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);其中M_PI為180度,后面三個參數xyz軸,z軸指向自己,其中繞着哪個軸旋轉傳參數1就可以了,其余兩個軸上的點坐標為0,如上,就會繞着空間(1,1)點的向量旋轉。 2:KVC:1:kvc的作用就是給某個對象的屬性賦值,下划線的成員變量也可以,屬性的屬性也可以,就用setValue forKeyPath,也可以將對象取出來,valueForkeyPath 2:通過kvc也可以快速做旋轉,平移,縮放: [self.imageV.layer setValue:@(100) forKeyPath:@"transform.translation.x"]; 3:transform等結構體變量,封裝為對象就用NSValue, NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)]; * */ -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //3D效果 [UIView animateWithDuration:0.5 animations:^{ //self.imageV.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0); //把結構體轉成對象 NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)]; //通過KVC一般是做快速旋轉,平移,縮放 [self.imageV.layer setValue:@(100) forKeyPath:@"transform.translation.x"]; }]; } @end
坐標系如圖
:
layer的 CATransform3D屬性.
只有旋轉的時候才可以看出3D的效果.
旋轉
x,y,z 分別代表x,y,z軸.
CATransform3DMakeRotation(M_PI, 1, 0, 0);
平移
CATransform3DMakeTranslation(x,y,z)
縮放
CATransform3DMakeScale(x,y,z);
可以通過KVC的方式進行設置屬性.
但是CATransform3DMakeRotation它的值,是一個結構體, 所以要把結構轉成對象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];
什么時候用KVC?
當需要做一些快速縮放,平移,二維的旋轉時用KVC.
比如: [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];
快速的進行縮放.
后面forKeyPath屬性值不是亂寫的.蘋果文檔當中給了相關的屬性.
二:CALayear 和UIView的區別:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //1:自定義layaer,對象方法alloc 或是類方法,color要轉換為CGColor,image要轉化為CGImage CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor redColor].CGColor; layer.frame = CGRectMake(50, 50, 100, 100); [self.view.layer addSublayer:layer]; //2:在圖層上添加圖片 /** * 圖層上添加圖片:圖層layear的contents是固定放圖片的,所以,往圖層上添加圖片要添加在layear的contents上,並且要轉換為CGImage * */ layer.contents = (id)[UIImage imageNamed:@"阿狸頭像"].CGImage; } @end
1.如何自定義Layer.
自定義CALayer的方式創建UIView的方式非常相似.
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(50, 50, 100, 100);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];
給layer設置圖片.
layer.contents = (id)[UIImage imageNamed:@"阿狸頭像"].CGImage;
2.關於CALayer的疑惑?
為什么要使用CGImageRef、CGColorRef?
為了保證可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
UIView和CALayer都能夠顯示東西,該怎樣選擇?
對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView可以
如果顯示出來的東西需要跟用戶進行交互的話,用UIView;
如果不需要跟用戶進行交互,用UIView或者CALayer都可以
CALayer的性能會高一些,因為它少了事件處理的功能,更加輕量級
三:CALayear的兩個重要屬性:position 和 anchorPoint
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *orangeView; /** <#注釋#> */ @property (nonatomic, weak) CALayer *layer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // CALayer *layer = [CALayer layer]; // layer.frame = CGRectMake(200, 200, 100, 100); // layer.backgroundColor = [UIColor redColor].CGColor; // // self.layer = layer; // [self.view.layer addSublayer:layer]; //UIView的center,就是它內部layer的position. NSLog(@"center = %@",NSStringFromCGPoint(self.orangeView.center)); NSLog(@"position = %@",NSStringFromCGPoint(self.orangeView.layer.position)); } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // self.layer.position = CGPointMake(200, 200); NSLog(@"center = %@",NSStringFromCGPoint(self.orangeView.center)); NSLog(@"position = %@",NSStringFromCGPoint(self.orangeView.layer.position)); self.orangeView.layer.anchorPoint = CGPointMake(0.5, 0); }
記住兩個重要的結論:1:UIView的center,就是它內部layer的position.UIView的center 和 圖層layear的potison是一樣的,修改任意一個,另一個都會同樣改變(前提是anchorPoint點是默認的0.5 ,0.5) 2:先定義好圖層layear的position,在定義好錨點anchorPoint,然后錨點就會平移到position點,兩點重合。
position和anchorPoint是CAlayer的兩個屬性.
我們以前修改一個控件的位置都是能過Frame的方式進行修改.
現在利用CALayer的position和anchorPoint屬性也能夠修改控件的位置.
這兩個屬性是配合使用的.
position:它是用來設置當前的layer在父控件當中的位置的.
所以它的坐標原點.以父控件的左上角為(0.0)點.
anchorPoint:它是決點CALayer身上哪一個點會在position屬性所指的位置
anchorPoint它是以當前的layer左上角為原點(0.0)
它的取值范圍是0~1,它的默認在中間也就是(0.5,0.5)的位置.
anchorPoint又稱錨點.就是把錨點定到position所指的位置.
兩者結合使用.想要修改某個控件的位置,我們可以設置它的position點.
設置完畢后.layer身上的anchorPoint會自動定到position所在的位置.