CoreAnimation 寄宿图

CoreAnimation 寄宿图


    CoreAnimation 目录html

    博客园makedown支持不佳,若有须要请进GitHub.git

寄宿图:图层中所包含的图 by:旭宝爱吃鱼github

    针对于寄宿图我在这里只讨论contents属性以及Custom Drawing.缓存

contents

content:内容app

    CALayer的contents属性是一个id类型.iview

@property(nullable, strong) id contents;

    所以,能够将任何类型的对象赋值给contents,可是若是将非CGImage类型的对象赋值给contents将会的到一个空白页.contents之因此会存在这种现象是由于Mac OS的历史缘由形成的.
    缘由: contents对CGImage类型的对象以及NSImage类型的对象都起做用!
    然而问题并非只有这么一点点,咱们能够尝试将UIImage的CGImage赋值给contents,不幸的是将会获得一个编译报错,产生错误的缘由是CGImage返回的CGImageRef并非一个Cocoa对象而是CoreFoundation类型,这时咱们须要用bridged关键字进行转换(MRC下不须要).布局

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

    下面咱们把一张图片赋值给contents.ui

    为了便于对比我将原图粘贴于此代理

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage * layerImage = [UIImage imageNamed:@"goddess"];
    
    // 在图层上添加图片
    self.customView.layer.contents = (__bridge id)layerImage.CGImage;// 图片一 
}

    展现效果以下:
code

    经过两行代码咱们将GODDESS添加到图层之上,可是与原图相比咱们发现goddess变胖了许多,咱们不但愿见到这中效果,所以咱们须要对contentGravity属性进行设置.

contentGravity

contentGravity:图层的展现类型.

    CALayer的contentsGravity属性是一个NSString类型.

@property(copy) NSString *contentsGravity;

    contentsGravity并无采起枚举类型的赋值方式,所以我在这里列出其相应的赋值范围.

  • kCAGravityCenter
  • kCAGravityTop
  • kCAGravityBottom
  • kCAGravityLeft
  • kCAGravityRight
  • kCAGravityTopLeft
  • kCAGravityTopRight
  • kCAGravityBottomLeft
  • kCAGravityBottomRight
  • kCAGravityResize
  • kCAGravityResizeAspect
  • kCAGravityResizeAspectFill

    为了改变上面结果的缺陷咱们添加如下代码:

layer.contentsGravity = kCAGravityResizeAspect;

    获得如下效果:

contentsScale

contentsScale:像素尺寸与试图大小的比例(默认1.0).

    contentsScale属性是为了适配高分辨的屏幕机制,若是咱们将其设置为1.0咱们的获得的即是一个点由两个像素组成,若是将其设置为2.0咱们获得的即是一个点由两个像素组成.
    通常状态下咱们设置的方式以下:

layer.contentsScale = [UIScreen mainScreen].scale;

    注意:
    当咱们能设置contentsGravity自动拉伸类状态时,设置contentsScale是没有效果的,由于contentsGravity已经对图层的展现进项了拉伸适配,若是咱们须要查看设置contentsScale的效果咱们能够将contentsGravity设置为kCAGravityCenter;

maskToBounds

maskToBounds:
YES(不展现图层之外的内容)
NO(展现图层之外的内容)

    代码示例:

layer. maskToBounds = YES;

    iOS视图默认容许咱们将一个尺寸较大的图层添加到一个尺寸较小的图层上并加以展现,可是此时处于父图层之外的子图层区域的点击等交互事件是监听不到的,以及其余展现效果的影响咱们在许多非正常布局的状况下咱们须要将maskToBounds设置为YES.或者UIView的clipsToBounds属性设置为YES.

contentsRect

contentsRect:容许在图层范围内显示寄宿图的一个子域.
{x,y,w,h} 四个参数的取值范围是0~1.

    默认状态下contentsRect的取值是{0,0,1,1},也就是默认状态下是显示整个寄宿图,也就是以下图的效果.

    如我咱们将contentsRect的取值设置为{0.5, 0.5, 0.5, 0.5},效果就变成以下图所示:

    在app中contentsRect比较典型的用法就是图片拼合用法,也就是咱们所须要展现的许多内容都在一张Image上,可是展现时经过contentsRect咱们将他们一一取出,这样就极大的节约了内存的使用率.

contentsCenter

contentsCenter:并非contents的中心点,而是定义了一个固定的边框和一个在图层上可拉伸的区域.

    contentsCenter使用效果和UIImage里的-resizableImageWithCapInsets: 方法效果很是相似,可是它能够运用到任何寄宿图,甚至包括在Core Graphics运行时绘制的图形,在这里就很少赘述具体的操做方法.

Custom Drawing

Custom Drawing:自定义绘制.

UIView-drawRect

    -drawRect并非一个十分陌生的方法,每当我么自定义UIView的时候均可一看到他的身影,他的自己含以也正如咱们自定义UIView的意图,咱们能够经过他实现自定义绘制寄宿图.
    -drawRect:方法是没有被苹果默认实现的,由于对与UIView来讲,寄宿图不是他所必须.若是UIView检测到-drawRect:方法被实现了,那么UIView会为视图分配一个寄宿图,寄宿图的像素尺寸等于视图大小乘以 contentsScale的值。须要注意的是若是咱们不须要使用寄宿图咱们不要实现-drawRect:,由于这会形成CPU以及内存的没必要要浪费,固然apple也是这么建议的.
    -drawRect:的调用是在视图出如今屏幕的时候,-drawRect:利用其封装的代码经过CoreGraphics来绘制一个寄宿图,当寄宿图绘制结束后会被缓存起来,直到它须要更新的时候(经过调用-setNeedsDisplay)去从新绘制更新.

CALayer-displayLayer:&&-drawLayer:inContext:

-displayLayer:对象方法
-drawLayer:inContext:代理方法

    咱们能够经过CALayerDelegate-drawLayer:inContext:来实现自定义绘制图层.须要作的内容很简单,设置layer的代理,而后实现-drawLayer:inContext:方法,当咱们须要更新绘制的时候调用-displayLayer:便可.

    注意:

  • CALayer不一样于UIView,当图层显示在屏幕上时,CALayer不会自动重绘它的内容,它把重绘的决定权交给了开发者。
  • 当使用CALayerDelegate绘制寄宿图的时候,并不会对超出边界外的内容进行绘制。
相关文章
相关标签/搜索