ios開發圖層layer與核心動畫二:CATransform3D,CAlayear和UIView區別,layer的position和anchorpoint


一: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所在的位置.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM