Categories: 技术原创

iOS学习笔记:CALayer的一些属性

1. contents 用于显示图片,这个属性虽然类型是id,但只能接受CGImageRef和NSImage对象,其它对象就会得到一个空白图层,需要注意OC中传递参数需要用到toll-free bridging,将CGImageRef转换为OC对象

1
layer.contents = (__bridge id)image.CGImage;

2. contentGravity 用于调整内容在图层中的边界怎么对齐,它是一个NSString型,值如下

1
`center', `top', `bottom', `left', `right', `topLeft', `topRight', `bottomLeft', `bottomRight',`resize', `resizeAspect', `resizeAspectFill'. The default value is `resize'.

苹果也提供了常量可用调用

1
2
3
4
5
6
7
8
9
10
11
12
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill

3. contentsScale 属性其实属于支持高分辨率(又称Hi-DPI或Retina)屏幕机制的一部分。它用来判断在绘制图层的时候应该为寄宿图创建的空间大小,和需要显示的图片的拉伸度。当我们手动选择不拉伸显示的时候(例如 contentGravity = kCAGravityCenter),这个时候就需要设置这个属性,否则在Retina屏幕上就会显示不正确,一般我们可以这样处理

1
layer.contentsScale = [UIScreen mainScreen].scale;

4. maskToBoundsUIView的clipsToBounds属性类似,设置为YES的时候超出范围的部分就不会显示啦

5. contentsRect 这里和frame,bounds都不一样,这里采用的是单位坐标,是相对于图片寄主的一个坐标系,如图

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

6. contentsCenter 这个东西跟contentsRect一样采用的是单位坐标,它和UIImage的resizableImageWithCapInsets:方法的效果很类似,出矩形的四个角外,其它区域按照如图方式进行拉伸。只是它可以运用到任何寄宿图,甚至包括在Core Graphics运行时绘制的图形。图2.9展示了contentsCenter设置为{0.25, 0.25, 0.5, 0.5}的效果。

这意味着我们可以随意重设尺寸,边框仍然会是连续的。
而且有个很赞的东西是IB上就可以直接操作这个属性

龚杰洪

Recent Posts

GOLANG面试八股文-并发控制

背景 协程A执行过程中需要创建…

1 年 ago

MYSQL面试八股文-常见面试问题和答案整理二

索引B+树的理解和坑 MYSQ…

1 年 ago

MYSQL面试八股文-InnoDB的MVCC实现机制

背景 什么是MVCC? MVC…

1 年 ago

MYSQL面试八股文-索引类型和使用相关总结

什么是索引? 索引是一种用于加…

1 年 ago

MYSQL面试八股文-索引优化之全文索引(解决文本搜索问题)

背景:为什么要有全文索引 在当…

1 年 ago