- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
iOS 核心动画的寄宿图.pdf
iOS 核⼼动画的寄宿图
寄宿图
图⽚胜过千⾔万语,界⾯抵得上千图⽚ ——Ben Shneiderman
我们在第⼀章 『图层树』中介绍了CALayer类并创 了⼀个简单的有蓝⾊背景的图
层。背景颜⾊还好啦,但是如果它仅仅是展现了⼀个单调的颜⾊未免也太⽆聊了。事
实上CALayer类能够包含⼀张你喜欢的图⽚,这⼀章节我们将来探索CALayer 的寄宿
图 (即图层中包含的图)。
contents属性
CALayer 有⼀个属性叫做contents,这个属性的类型被定义为id ,意味着它可以是
任何类型的对象。在这种情况下,你可以给contents属性赋任何值,你的app仍然能
够编译通过。但是,在实践中,如果你给contents赋的不是CGImage ,那么你得到
的图层将是空⽩的。
contents这个奇怪的表现是由Mac OS的历史原因造成的。它之所以被定义为id类
型,是因为在Mac OS系统上,这个属性对CGImage和NSImage类型的值都起作⽤。如
果你试图在iOS平台上将UIImage的值赋给它,只能得到⼀个空⽩的图层。⼀些初识
Core Animation的iOS开发者可能会对这个感到困惑。
头疼的不仅仅是我们刚才提到的这个问题。事实上,你真正要赋值的类型应该是
CGImageRef ,它是⼀个指向CGImage结构的指针。UIImage有⼀个CGImage属性,它
返回⼀个CGImageRef,如果你想把这个值直接赋值给CALayer 的contents,那你将
会得到⼀个编译错误。因为CGImageRef并不是⼀个真正的Cocoa对象,⽽是⼀个Core
oundation类型。
尽管Core oundation类型跟Cocoa对象在运⾏时貌似很像 (被称作toll-free bridging ),
他们并不是类型兼容的,不过你可以通过bridged关键字转换。如果要给图层的寄宿图
赋值,你可以按照以下这个⽅法:
layer.contents = (__bridge id)image.CGImage;
如果你没有使⽤ARC (⾃动引⽤计数),你就不需要__bridge这部分。但是,你⼲嘛
不⽤ARC ?!
让我们来继续修改我们在第⼀章新 的⼯程,以便能够展⽰⼀张图⽚⽽不仅仅是⼀个
背景⾊。我们已经⽤代码的⽅式 ⽴⼀个图层,那我们就不需要额外的图层了。那么
我们就直接把layerView的宿主图层的contents属性设置成图⽚。
清单2.1 更新后的代码。
@implementation ViewController
- (void)view idLoad
{
[super view idLoad]; //load an image
UIImage *image = [UIImage imageNamed:@Snowman.png];
//add it directly to our view s layer
self.layerView .layer.contents = (__bridge id)image.CGImage;
}
@end
图表2.1 在UIView的宿主图层中显⽰⼀张图⽚
我们⽤这些简单的代码做了⼀件很有趣的事情:我们利⽤CALayer在⼀个普通的
UIView 中显⽰了⼀张图⽚。这不是⼀个UIImageView ,它不是我们通常⽤来展⽰图⽚
的⽅法。通过直接操作图层,我们使⽤了⼀些新的函数,使得UIView更加有趣了。
contentGravity
你可能已经注意到了我们的雪⼈看起来有点。。。胖 ==! 我们加载的图⽚并不刚
好是⼀个⽅的,为了适应这个视图,它有⼀点点被拉伸了。在使⽤UIImageView的时
候遇到过同样的问题,解决⽅法就是把contentMode属性设置成更合适的值,像这
样:
view .contentMode = UIViewContentModeScaleAspectFit;
这个⽅法基本和我们遇到的情况的解决⽅法已经接近了 (你可以试⼀下 :) ),不过
UIView⼤多数视觉相关的属性⽐如contentMode,对这些属性的操作其实是对对应
图层的操作。
CALayer与contentMode对应的属性叫做contentsGravity,但是它是⼀个
NSString类型,⽽不是像对应的UIKit部分,那⾥⾯的值是枚举。contentsGravity
可选的常量值有以下⼀些:
kCAGravityCenter
文档评论(0)