博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS核心动画笔记2-寄宿图
阅读量:7073 次
发布时间:2019-06-28

本文共 2548 字,大约阅读时间需要 8 分钟。

hot3.png

寄宿图

1. contents属性

CAlayer有一个contentes属性, 这个属性被定义成id类型, 不管给它赋值任意类型都可以编译通过, 但是, 只有赋值CGImage类型才能正常展示出来一个图片, 其他类型得到的图层将是空白的. 之所以会出现这个问题原因是Mac OS的历史原因造成的. 因为在Mac OS系统上, 这个属性对CGImage和NSImage类型的值都起作用(所以被定义成id类型),但是在iOS上只支持CGImage类型不支持UIImage.

实际上, 当对contents赋值时候回发现, CGImageRef类型并不是id类型的, 而是一个Core Foundation类型, 不过他们之间可以简单的转换:layer.contents = (__bridge id)image.CGImage;

2. contentsGravity属性

通过contents属性可以将一个图片展示到layer上面, 并且会压缩或者拉伸图片以充满整个layer, 事实上, layer还有一个contentsGravity属性,作用类似于UIImageView的contentMode, 可以自定义内容的对齐方式.

contentsGravity的值并不是枚举类型, 而是字符串常量类型的:

kCAGravityCenterkCAGravityTopkCAGravityBottomkCAGravityLeftkCAGravityRightkCAGravityTopLeftkCAGravityTopRightkCAGravityBottomLeftkCAGravityBottomRightkCAGravityResizekCAGravityResizeAspectkCAGravityResizeAspectFill

3. contentsScale属性

contentsScale定义了寄宿图像素尺寸和视图大小的比例,默认是值为1.0的浮点数. contentsScale属性是支持高分辨率屏幕机制的一部分, 用来判断在绘制图层时候, 应该为寄宿图创建的空间大小.

如果contentsScale设置为1.0, 将会以每个点1个像素绘制, 如果设置为2.0, 将会以每个点两个像素绘制, 就是retain屏幕的绘制方式.

通常我们这一这样设置: layer.contentsScale = [UIScreen mainScreen].scale;

4. masksTobounds属性

这个实际上用的还是比较多的, 不做过多解释.

这个属性对应于UIView的clipsToBounds, UIView的clipsToBounds属性实际上也是通过layer的masksToBounds来设置的. (已用代码验证)

5. contentsRect属性

contentsRect属性允许我们在图层边框内显示寄宿图的一个子域. contentsRect不是按点来计算的,他使用单位坐标,单位坐标指定在0到1之间,是一个相对值. 它是相对于寄宿图的尺寸的.

iOS中使用的坐标系统:

  • 点 —— 在iOS和Mac OS中最常见的坐标体系。点就像是虚拟的像素,也被称作逻辑像素。在标准设备上,一个点就是一个像素,但是在Retina设备上,一个点等于2*2个像素。iOS用点作为屏幕的坐标测算体系就是为了在Retina设备和普通设备上能有一致的视觉效果。
  • 像素 —— 物理像素坐标并不会用来屏幕布局,但是仍然与图片有相对关系。UIImage是一个屏幕分辨率解决方案,所以指定点来度量大小。但是一些底层的图片表示如CGImage就会使用像素,所以你要清楚在Retina设备和普通设备上,他们表现出来了不同的大小。
  • 单位 —— 对于与图片大小或是图层边界相关的显示,单位坐标是一个方便的度量方式, 当大小改变的时候,也不需要再次调整。单位坐标在OpenGL这种纹理坐标系统中用得很多,Core Animation中也用到了单位坐标。

6. contentsCenter属性

从名字上看, 好像是关于位置的属性, 其实并不是. 它使用的也是单位坐标, 它是一个CGRect类型的. 它定义了一个固定的边框和一个在图层上课拉伸的区域, 改变contentsCenter并不会影响寄宿图的显示, 除非这个图层的大小改变了, 才能看得到效果.

这个属性我试了下 还是有效果的, 但是对它不是很理解, 现在我对它的理解就是, 可以自定义压缩或者拉伸图片的区域.

一个拉伸的例子, contentsCenter是一个CGRect类型的值, 前两个参数代表起始位置, 后两个参数代表拉伸的范围, 都用单位坐标表示.

详解:

7. contents属性并不是设置寄宿图的唯一方式

如题, 除了contents, 我们也可以直接通过layer的代理方法通过Core Graphics进行绘制.

-drawRect方法没有默认的实现, 因为对于UIView来说, 寄宿图并不是必须的, 它不在意到底是单调的颜色还是有一个图片的实例. 但是如果系统检测到-drawRect:方法被调用了, 就会把它当成一个寄宿图, 这个寄宿图的大小等于视图大小乘以contentsScale的值.

所以, 如果不需要寄宿图, 那么久不要实现这个方法, 否则会造成CPU资源和内存资源的浪费, 苹果也建议: 如果没有自定义绘制任务就不要在子类中写一个空的-drawRect:方法.

当视图在屏幕上出现的时候 -drawRect:方法就会被自动调用。-drawRect:方法里面的代码利用Core Graphics去绘制一个寄宿图,然后内容就会被缓存起来直到它需要被更新(通常是因为开发者调用了-setNeedsDisplay方法,尽管影响到表现效果的属性值被更改时,一些视图类型会被自动重绘,如bounds属性)。虽然-drawRect:方法是一个UIView方法,事实上都是底层的CALayer安排了重绘工作和保存了因此产生的图片。

转载于:https://my.oschina.net/whforever/blog/724239

你可能感兴趣的文章
第二课unit3 系统延迟及定时机制
查看>>
十二月机房考核
查看>>
shell 类型
查看>>
网页中meta标记
查看>>
python爬虫笔记-day5
查看>>
Jenkins+newman 控制台输出样式
查看>>
公司业务转型,IT基础架构也要转型,京东云Docker容器集群微服务实践
查看>>
解释try_files $uri $uri/ /index.php$is_args$args;
查看>>
营销圈也可以提供类似“不涂口红的你”的创意文案?
查看>>
【源码分享】短信验证码功能对接CmsEasy
查看>>
学习linux入门之top命令的用法介绍
查看>>
MySQL的基础分部
查看>>
aix knowlgdgecenter
查看>>
好程序员分享JavaScript事件委托代理和函数封装详解
查看>>
VMWARE 占用硬盘空间只增大不减少的清理办法
查看>>
oracle技术之系统触发器的应用顺序(三)
查看>>
oracle RMAN备份FORMAT格式中%a的含义
查看>>
Oracle11gr2数据泵新特性(四)
查看>>
Oracle 11g r2数据泵新特性(一)
查看>>
我的友情链接
查看>>