• 《iOS核心动画高级技巧》part1-CALayer


    UIView和CALayer的选择

    可以发现,前面的2个效果不仅可以通过添加层来实现,还可以通过添加UIView来实现。如显示图片的层可以用一个UIImageView来实现。 既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?

    其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以。

    所以,在选择的过程中,需要考虑到实际的情况,如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以

    当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级 。

    特别注意:如果一个控件是另外一个控件的子控件,那么这个控件的layer也是另一个控件的子layer。

    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self addLayerTwo];
    //    [self addLayerOne];
    }
    
    //part1
    -(void)addLayerOne{
        //添加图层
        CALayer *blueLayer = [CALayer layer];
        blueLayer.frame = CGRectMake(20.0,20.0,50.0, 50.0);
        blueLayer.backgroundColor= [UIColor blueColor].CGColor;
        [self.view.layer addSublayer:blueLayer];
        
        
        
        
        //为图层添加内容(图片)
        UIImage *image = [UIImage imageNamed:@"appResearch"];
        self.myView.layer.contents = (__bridge id)image.CGImage;
        //为图层设置图片的模式
        self.myView.layer.contentsGravity = kCAGravityCenter;
        //设置圆角半径为10
        self.myView.layer.cornerRadius=10;
        //如果设置了图片,那么需要设置这个属性为YES才能显示圆角效果
        self.myView.layer.masksToBounds=YES;
        //设置边框
        self.myView.layer.borderWidth=3;
        self.myView.layer.borderColor=[UIColor brownColor].CGColor;
    }
    //part2
    -(void)addLayerTwo{
        CALayer *layer = [[CALayer alloc]init];
        layer.backgroundColor = [UIColor brownColor].CGColor;
        layer.bounds = CGRectMake(0, 0, 50, 50);
        layer.position = CGPointMake(100, 100);//锚点到父层(0,0)的坐标的距离,锚点默认为(0.5,0.5)居中
        [self.myView.layer addSublayer:layer];
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end

     layer的响应事件

    -(void)part1EventResponse{
        //响应测试
        self.blueLayer = [CALayer layer];
        self.blueLayer.frame = CGRectMake(50, 50, 100, 100);
        self.blueLayer.backgroundColor = [UIColor blueColor].CGColor;
        self.blueLayer.delegate = self;
        [self.view.layer addSublayer:self.blueLayer];
    }
    
    -(void)touchesBegan:(NSSet *)touches
              withEvent:(UIEvent *)event{
        CGPoint point = [[touches anyObject]locationInView:self.view];
        NSLog(@"point1=%@",NSStringFromCGPoint(point));
        if ([self.view.layer containsPoint:point]) {
            //判断点击区域方法1
    //        point = [self.blueLayer convertPoint:point fromLayer:self.view.layer];
    //        NSLog(@"point2=%@",NSStringFromCGPoint(point));
    //        if ([self.blueLayer containsPoint:point]) {
    //            [[[UIAlertView alloc]initWithTitle:@"layer" message:nil delegate:nil cancelButtonTitle:@"sure" otherButtonTitles:nil, nil] show];
    //        }
            //判断点击区域方法2
            CALayer *layer = [self.view.layer hitTest:point];
            if (layer==self.blueLayer) {
                [[[UIAlertView alloc]initWithTitle:@"layer" message:nil delegate:nil cancelButtonTitle:@"sure" otherButtonTitles:nil, nil] show];
            }
        }
    }

    添加layer图层蒙版

        //图层蒙板
        CALayer *maskLayer = [CALayer layer];
        UIImage *image = [UIImage imageNamed:@"tuxedomask"];
        maskLayer.contents = (__bridge id)(image.CGImage);
        maskLayer.frame = CGRectMake(0, 0, image.size.width, image.size.height);
        self.imageView.layer.mask = maskLayer;

    设置layer的矩阵变换

    //********************************2d*****************************//
        //简单操作
        //    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI_4);
        
        //组合操作
    //    CGAffineTransform originTransform = CGAffineTransformIdentity;
    //    originTransform = CGAffineTransformScale(originTransform, 0.5, 0.5);
    //    originTransform = CGAffineTransformTranslate(originTransform, 200, 0);
    //    originTransform = CGAffineTransformRotate(originTransform, M_PI_4);
    //    self.imageView.layer.affineTransform = originTransform;
        //********************************3d*****************************//
        //没有设置m34透视投影的情况
    //    CATransform3D transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
    //    self.imageView.layer.transform = transform;
        //设置m34透视投影.需要设置视觉相机和屏幕之间的距离,通常是500~1000
        CATransform3D transform = CATransform3DIdentity;
        transform.m34 = -1.0/500;//
        transform = CATransform3DRotate(transform, M_PI_4, 0, 1, 0);
        self.imageView.layer.transform = transform;

     设置组合图层的矩阵变换

    //sublayerTransform设置所有本图层及所有子图透视投影
        CATransform3D perspective = CATransform3DIdentity;
        perspective.m34 = -1.0/500;
        self.backgroundView.layer.sublayerTransform = perspective;
        
        CATransform3D transform1 = CATransform3DMakeRotation(M_PI_4, 0, 1, 0);
        self.view1.layer.contents  = (__bridge id)([UIImage imageNamed:@"123.jpg"].CGImage);
        self.view1.layer.transform = transform1;
        
        CATransform3D transform2 = CATransform3DMakeRotation(-M_PI_4, 0, 1, 0);
        self.view2.layer.contents = (__bridge id)([UIImage imageNamed:@"123.jpg"].CGImage);
        self.view2.layer.transform = transform2;
  • 相关阅读:
    leetcode整理(一)
    day02 整理
    python从入门到放弃之守护进程
    python从入门到放弃之进程
    基于hashlib下的文件校验
    hashlib(hmac)进阶之client跟server交互
    hashlib以及hmac的日常应用
    python从入门到放弃
    6.redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
    5.如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?
  • 原文地址:https://www.cnblogs.com/huen/p/4286948.html
Copyright © 2020-2023  润新知