zoukankan      html  css  js  c++  java
  • (一一九)通过CALayer实现阴影、圆角、边框和3D变换

    在每个View上都有一个CALayer作为父图层,View的内容作为子层显示,通过layer的contents属性决定了要显示的内容,通过修改过layer的一些属性可以实现一些华丽的效果。

    【阴影和圆角】

    下面以一个普通的蓝色View为例,介绍layer的功能:

    _blueView.layer.shadowOpacity = 1.0; // 阴影不透明度
    _blueView.layer.shadowColor = [UIColor redColor].CGColor; // 注意所有颜色都要转换为CGColor
    _blueView.layer.shadowRadius = 20.0; // 阴影半径
    _blueView.layer.shadowOffset = CGSizeMake(20, 20); //阴影偏移,以View中心为原点
    _blueView.layer.cornerRadius = _blueView.frame.size.width * 0.5; // 圆角半径,当圆角半径为View尺寸一半时恰好得到圆形
    _blueView.layer.borderColor = [UIColor whiteColor].CGColor; // 边框颜色
    _blueView.layer.borderWidth = 5; // 边框尺寸

    通过这段代码,我们设置了蓝色View的一系列属性,注意设置颜色时的转换。得到的效果如下图所示:

    通过这一点我们可以看到layer的强大。


    通过这样的方法,我们可以轻易的实现头像的圆角和外框,只要设置UIImageView的layer圆角、边框即可,需要注意的是,图片所在的层是其子层,因此应该设置父层的maskToBounds属性,保证子层裁剪到父层的尺寸

    _headerView.layer.cornerRadius = _headerView.frame.size.width * 0.5;
    _headerView.layer.masksToBounds = YES; // 保证子层裁剪到父层尺寸
    _headerView.layer.borderWidth = 5;
    _headerView.layer.borderColor = [UIColor redColor].CGColor;
    实现的效果如下图所示:



    【3D变换】

    直接修改View的transform,可以实现2D变换,而修改layer可以实现3D变换,3D变换的意义在于可以让图像以与屏幕平行的方向为轴旋转,或者斜着向屏幕内翻转,实现立体效果,要实现3D变换,只要传递3D向量坐标即可,先了解一下坐标系。

    与二维类似,向右为x、向下为y,垂直屏幕向外为z。

    旋转时,传递的是弧度制转角和旋转轴坐标。

    平移时,传递的是三轴的位移量,如果没有相对屏幕翻转,z轴的位移是看不出来的。

    缩放时,传递的是三轴的缩放量。

    需要注意的是,这三个量通过make实现,则会相互覆盖,一定要保证前面完成后再传递下一个动作。

    _blueView.layer.transform = CATransform3DMakeRotation(M_PI, 1, 1, 0);
    _blueView.layer.transform = CATransform3DMakeTranslation(10, 10, 0);
    _blueView.layer.transform = CATransform3DMakeScale(0.5, 0.5, 1.0);
    除此之外,还可以通过KVC实现属性的操作,通过KVC还可以实现对不能直接访问的属性的操作,例如translation.x。

    普通的设置:

    [_blueView.layer setValue:[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 1, 0)] forKeyPath:@"transform"];
    
    对不能直接访问属性的设置,不推荐。

    [_blueView.layer setValue:@30 forKeyPath:@"transform.translation.x"];
    
    通过3D变换可以做出各种酷炫的效果,例如下图相对屏幕旋转:


  • 相关阅读:
    杂记:Linux下gcc升级
    杂记:OSX下编译安装最新版RedisDesktopMmanager
    查漏补缺:Vector中去重
    Mac下使用VScode进行C/C++开发
    添砖加瓦:几种常见的数据摘要算法(MD5、CRC32、SHA1和SHA256)
    添砖加瓦:snappy无损压缩算法
    杂记:OSX 安装openssl
    码海拾遗:内存四区
    Luogu 4284 [SHOI2014]概率充电器
    Luogu 4473 [国家集训队]飞飞侠
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154057.html
Copyright © 2011-2022 走看看