在每个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变换可以做出各种酷炫的效果,例如下图相对屏幕旋转:

最新文章

  1. Linux下命令行安装weblogic10.3.6
  2. idea配置2个tomcat
  3. Func<T,T>应用之Elasticsearch查询语句构造器的开发
  4. 一个有趣的基于C++的模拟发牌程序
  5. js:数据结构笔记12--排序算法(2)
  6. 根据采购/销售订单创建STO/SO
  7. mongodb不同版本之间有很大的差异
  8. iOS开发——语法OC篇&Block回顾
  9. servletContext百科
  10. Delphi版IP地址与整型互转
  11. Python的语言类型
  12. AngularJS进阶(十四)AngularJS灵异代码事件
  13. CSS之分组选择器和嵌套选择器
  14. 关于.idea未上传导致不能显示项目文件结构的问题
  15. 伪触发 input file 的click事件
  16. Luogu2022 有趣的数-二分答案+数位DP
  17. python+selenium环境配置及浏览器调用
  18. request对象方法
  19. [转载]function与感叹号
  20. C++ 11 - STL - 函数对象(Function Object) (上)

热门文章

  1. [LSGDOJ 1505]售货员的难题 状压DP
  2. 51Nod 1331 狭窄的通道
  3. 【Halum操作-UVA 11478】
  4. 对中断的理解handle_level_irq【原创】
  5. Cookie 和 Session的基本使用
  6. 《Java技术》第一次作业——Java语言基础
  7. DeepMoji:机器学习模型分析情绪, 情感
  8. HttpClient 实现 get,post请求
  9. java HTTP请求工具
  10. react 踩的坑