文档章节

iOS核心动画笔记2-寄宿图

hell03W
 hell03W
发布于 2016/07/30 17:51
字数 1420
阅读 51
收藏 0

寄宿图

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安排了重绘工作和保存了因此产生的图片。

© 著作权归作者所有

共有 人打赏支持
hell03W
粉丝 9
博文 145
码字总数 109892
作品 0
朝阳
程序员
iOS开发之核心动画 高级技巧

今天在开发者头条看到了,看了几章,就停不下来了,各种细节都讲得很详细,无可挑剔! 另外,因为最近项目的时候,很多地方实现都要求加入动画,提高用户体验,刚好可以好好学习下。 主要目录...

神补刀
2015/08/06
0
0
GPU vs CPU in iOS

一直以来,我们做产品的时候并没有特别的去考虑CPU/GPU的使用,最近为了提升可视化功能的性能,发现合理使用GPU也是一个可以好好研究的部分,这里总结一下一些有用的信息。 中央处理器 CPU ...

雨_树
07/10
0
0
UIView Animations 学习笔记(二)定制动画效果及切换效果

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animations 学习笔记(二)定制动画效果及切换效果 UIView Animation 学习笔记 应用示例 二、视图切换定制 2.1 基础说明 要创建...

灰大羊
2015/08/12
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0
[iOS Animation]-CALayer 专用图层 富文本

富文本 iOS 6中,Apple给UILabel和其他UIKit文本视图添加了直接的属性化字符串的支持,应该说这是一个很方便的特性。不过事实上从iOS3.2开始CATextLayer就已经支持属性化字符串了。这样的话,...

浩浩老师
2015/09/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
44分钟前
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
7
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
16
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部