文档章节

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

hell03W
 hell03W
发布于 2016/07/30 17:51
字数 1420
阅读 49
收藏 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
博文 143
码字总数 108663
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

React16.4 开发简书项目 从零基础入门到实战

React16.4 开发简书项目 从零基础入门到实战 关注我的订阅号下载 React16.4 开发简书项目 从零基础入门到实战

蜗牛奔跑
9分钟前
0
0
day57-20180815-流利阅读笔记-待学习

社恐怎么办?这个漫画或许能治愈你 毛西 2018-08-15 1.今日导读 近日,芬兰漫画家卡罗利娜·科尔霍宁创作的绘本《芬兰人的噩梦》在中国大火。一时间书中的主人公马蒂成为了人们茶余饭后热议的...

aibinxiao
13分钟前
3
0
用REDIS实现分布式缓存

第一:Redis 是什么? Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有...

明理萝
14分钟前
1
1
【Java】留下没有基础眼泪的面试题

前言 只有光头才能变强 本文力求简单讲清每个知识点,希望大家看完能有所收获 一、如何减少线程上下文切换 使用多线程时,不是多线程能提升程序的执行速度,使用多线程是为了更好地利用CPU资...

Java3y
16分钟前
0
0
SpringCloud SpringBoot mybatis分布式微服务云架构开发Web应用(2)

在完成配置之后,举一个简单的例子,在快速入门工程的基础上,举一个简单的示例来通过Thymeleaf渲染一个页面。 @Controllerpublic class HelloController { @RequestMapping("/")...

itcloud
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部