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

  • 相关阅读:
    关于生成并发唯一性流水号的解决方案
    父页面得到<iframe>
    struts2 convention配置中常见配置选项及说明
    Struts2下关于Calendar,date的一些处理
    怎样将用户名和密码保存到Cookie中?【转】
    如何调用用户控件(UserControl)的方法 .
    Struts遍历标签<s:iterator>总结 .
    在事业的开展上保持归零的心态
    这种日子最轻松,这样的人生最快乐
    诚实是人世间最珍贵的宝物,是每个人都应当坚守的伟大情操
  • 原文地址:https://www.cnblogs.com/cqb-learner/p/5832320.html
Copyright © 2020-2023  润新知