iOS核心动画笔记2-寄宿图
博客专区 > hell03W 的博客 > 博客详情
iOS核心动画笔记2-寄宿图
hell03W 发表于1年前
iOS核心动画笔记2-寄宿图
  • 发表于 1年前
  • 阅读 37
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

寄宿图

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的值并不是枚举类型, 而是字符串常量类型的:

kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill

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类型的值, 前两个参数代表起始位置, 后两个参数代表拉伸的范围, 都用单位坐标表示.

详解:http://wiki.jikexueyuan.com/project/ios-core-animation/boarding-figure.html

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

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

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

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

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

共有 人打赏支持
粉丝 8
博文 130
码字总数 95347
×
hell03W
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: