专栏首页macOS 开发学习CALayer 实用属性补充

CALayer 实用属性补充

为方便对CALayer的学习,特记录以下内容,整理自ios核心动画高级技巧 · GitBook (墙裂推荐阅读此翻译文档)

 contents 属性

这个属性的类型被定义为id(这是由于MacOSX历史原因造成的,因为在Mac中这个属性对CGImage和NSImage都起作用),意味着它可以时任何对象类型,但实际上,如果给contents赋值不是CGImageRef,得到的都将是空白图片。可是CGImageRef属于Core Foundation类型,所以,赋值的时候,需要进行桥接转换。

示例1:  -(void\)viewDidLoad { [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@"demoImage"];  self.demoView.layer.contents = (__bridge id )(image.CGImage);  }

contentsGravity

这个属性是NSString类型,它和UIView的contentMode一样,目的是为了处理内容在图层的边界内如何对齐。可选的常量值有以下这些:

kCAGravityCenter

kCAGravityCenter

 kCAGravityTop

kCAGravityTop

 kCAGravityBottom

kCAGravityBottom

 kCAGravityLeft

kCAGravityLeft

 kCAGravityRight

kCAGravityRight

 kCAGravityTopLeft

kCAGravityTopLeft

 kCAGravityTopRight

kCAGravityTopRight

 kCAGravityBottomLeft

kCAGravityBottomLeft

 kCAGravityBottomRight

kCAGravityBottomRight

 kCAGravityResize(默认值)

kCAGravityResize

 kCAGravityResizeAspect

kCAGravityResizeAspect

 kCAGravityResizeAspectFill

kCAGravityResizeAspectFill

 contentsScale

这个属性是浮点类型,默认值为1.0,它定义了像素尺寸和视图大小的比例(类似于分辨率,UIView相似功能的属性是contentScaleFactor)。如果设置了contentsGravity属性为kCAGravityResizeAspect(拉伸)时,将会忽略contentsScale,因为拉伸图片适应图层时,根本不会考虑分辨率问题。当我们使用UIImage时,会获取高质量的图片,但CGImage没有拉伸概念,因此使用CGImage设置图片时,拉伸的因素会在转换的时候丢失,当用代码设置contents图片时,要手动设置图层的contentsScale的属性,避免Retina屏幕显示错误

layer.contentsScale = [UIScreen mainScreen].scale;

contentsScale

maskToBounds

默认情况下,UIView会绘制超过边界的内容或子视图,CALayer也一样。UIView有一个叫做clipsToBounds属性可以用来决定是否显示超出边界的内容,CALaer对应的属性是maskToBounds,设置为YES,会剪去超出边界的部分(不显示)。

 contentsRect

这个属性是CGRect类型,它允许我们设置图层显示内容图片的一个区域。与bounds和frame不同,contentsRect不是使用点来计算的,它使用了单位坐标,值在0~1之间。默认值是{0,0,1,1},意为整个图片大小。

图片选自网络

contentsRect在App中常常用来将拼合的图片裁剪开来,分解成各个部分显示出来。

 示例2:

 @interface ViewController()
 @property (strong, nonatomic) IBOutletCollection(UIView) NSArray *spriteImages;
 @end
 @implementation ViewController
 -(void)viewDidLoad {
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"compsiteImage"];
NSUInteger count = self.spriteImages.count;
for(int i = 0; i < count; i++) {
 UIView *view = self.spriteImages[i];
 CGRect rect = CGRectMake(i * 1.0/ count , 0, 1.0/count, 1);
[self addImage:image toView:view withContentsRect:rect];
 }
 }
 -(void)addImage:(UIImage *)image toView:(UIView *)toView withContentsRect:(CGRect)rect{
toView.layer.contents = (__bridge id)image.CGImage;
 toView.layer.contentsRect = rect;
 }

 @end

demo

 contentsCenter

这个属性类型是CGRect,它用来确定图层上可拉伸区域,使用单位坐标,默认值是{0,0,1,1}. 它与UIImage的-resizableImageWithCapInsets:方法相似。

contentsCenter

这个属性是可以在Interface Builder 里面进行配置的。

Stretching

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UI篇-Layer几个关键点补充

    强大的UIView是基于 CALayer实现的,它的重要性不言而喻,相信大家也都有自己的研究和理解,今天这片文章里的内容是几个关键点的补充。

    進无尽
  • Lottie动画原理

    导语:Lottie动画是Airbnb开源的一个支持 Android、iOS 以及 ReactNative。通过AE导出的JSON文件+Lottie库可快速实现...

    QQ音乐技术团队
  • iOS面试题-UI篇

    面试题持续整理更新中,如果你正在面试或者想一起进阶,不妨添加一下交流群1012951431一起交流。

    会写bug的程序员
  • 老司机带你走进Core Animation 之CAShapeLayer和CATextLayer

    老司机带你走进Core Animation 之CAShapeLayer和CATextLayer

    老司机Wicky
  • iOS动画系列之四:基础动画之平移篇2. 创建不同速度控制的动画3. Swift版本的部分差异

    stanbai
  • iOS开发CoreAnimation解读之二——对CALayer的分析

            每一个UIView的对象中都有一个layer这样的属性,并且layer会负责view中有关图形绘制的相关操作,例如我们设置view的背景颜色和设...

    珲少
  • iOS 动画笔记 (一)

    你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口...

    Mr.RisingSun
  • 老司机带你走进Core Animation 之CAAnimation

    开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理。不过既然我现在回来了,那么这将是一个井喷的时节...

    老司机Wicky
  • iOS动画-CALayer基础知识

    核心动画Core Animation,其实是由Layer Kit这样一个名字演变而来。它实际上是一个复合引擎,可以将存储在图层树体系中的不同独立图层,尽可能快地...

    梧雨北辰
  • 高性能设置圆角,告别离屏渲染

    今天来写一个老生常谈的话题,也是一个面试的高频问题,我也在面试时不止一次被问到过这个问题——如何高性能的设置圆角。就用他作为2017年春节上班之后的第一篇文章。

    Originalee
  • Quartz2D复习(四) --- 图层CALayer和动画CAAnimation

    1)、在ios中,能看得见摸得着的东西基本上都是UIView, 比如按钮、文本标签、文本输入框、图标等,这些都是UIView

    tandaxia
  • Core Animation Programming

    Core Animation 这个框架实际上非常容易让iOS开发者误解仅仅是用来做动画效果的框架.实际上动画仅仅是是它功能的冰水一角. 它包括了图形绘制,投影,...

    CC老师
  • iOS Core Animation的用法

    越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低;反之亦然。本文着重介绍Core Animation层的基本动画实现方案。

    剑行者
  • 细述Kubernetes和Docker容器的存储方式

    #####集合视图的作用 集合视图是为了增强网格视图开发而在IOS6中开放的集合视图API。 #####集合视图的组成 集合视图有4个重要的组成部分,分别为:

    全栈程序员站长
  • iOS动画系列之八:使用CAShapeLayer绘画动态流量图1. CAShapeLayer2. 实战:绘制一个镂空图层动画3. 使用CAShapeLayer绘画动态流量图

    stanbai
  • 绘图-CAShapeLayer、CABasicAnimation以及核心动画

    QeartzCore是iOS中的图层框架,Quartz Core 的渲染能力可以像三维一样对二维图像进行任意操纵,在这个框架中我们可以对试图的图层进行定制,以实...

    進无尽
  • Core Animation总结

    众所周知,绚丽动画效果是iOS系统的一大特点,通过UIView层封装的动画,基本可以满足我们应用开发的所有需求,但若需要更加自由的控制动画的展示,我们就需要使用...

    iOSSir
  • iOS面试题:UIView block动画实现原理

    在了解UIView block动画实现原理之前,需要先了解CALayer的可动画属性。

    猿_人类
  • iOS动画三板斧(二)--CoreAnimation动画介绍使用附加

    第二板斧就是用的最多的CoreAnimation动画库,简称是CA,所以动画类都是CA开头。所有的动画类都在 QuartzCore 库中,在iOS7之前使用需要...

    Haley_Wong

扫码关注云+社区

领取腾讯云代金券