CALayer----寄宿图

寄宿图

  • 什么是寄宿图

图层中包含的 View

1. contents 属性

contents

1> CALayer 的属性之一
2> 该属性的类型 id
3> 可赋给该属性CGImage,用以展示图片


类型转化问题

形如:

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

  • UIImage: 存在CGImage属性(Cocoa下对象),返回“CGImageRef”,返回的是CoreFundation下的类型,因此需要类型转化一下
  • __bridge: 只有非ARC下才不需要转化

  • 代码示例:
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *layerView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage *image = [UIImage imageNamed:@"li"];
    self.layerView.layer.contents = (__bridge id)image.CGImage;
    self.layerView.layer.cornerRadius = 5.0f;
    self.layerView.layer.borderWidth = 2.0f;
    self.layerView.layer.borderColor = [UIColor grayColor].CGColor;
    self.layerView.layer.masksToBounds = YES;
}  
  • 效果示意:


    contents图

contentGravity

从上面的效果来看,图片是有一些变形的,right??

  • UIView 层初级改良:
//Scale:拉伸图片
//    Aspect:图片长宽的比例,保持图形的长宽比,保持图片不变形。
//    Aspect Fill:在保持长宽比的前提下,缩放图片,使图片充满容器。
//    Aspect Fit:在保持长宽比的前提下,缩放图片,使得图片在容器内完整显示出来。
//    Scale to Fill: 缩放图片,使图片充满容器。图片未必保持长宽比例协调,有可能会拉伸至变形
    self.layerView.contentMode = UIViewContentModeScaleAspectFit;  
初级改良
  • 图层 层面改进
    /* A string defining how the contents of the layer is mapped into its
    * bounds rect. Options are `center', `top', `bottom', `left',
    * `right', `topLeft', `topRight', `bottomLeft', `bottomRight',
    * `resize', `resizeAspect', `resizeAspectFill'. The default value is
    * `resize'. Note that "bottom" always means "Minimum Y" and "top"
    * always means "Maximum Y".*/

//  属于CALayer的内容模式
 self.layerView.layer.contentsGravity = kCAGravityResizeAspect;

contentsScale

  1. 去除像素化
  2. 定义寄宿图的像素尺寸和视图大小的比例
layer.contentsScale = [UIScreen mainScreen].scale;  

maskToBounds

等同于UIView的clipsToBounds的属性,去除超出边界的内容


Custom Drawing

除了给图层设置contents的寄宿图,也可以直接用CoreGraphics直接绘制(继承UI View并实现-drawRect:方法)

  • -drawRect:方法的实现

UIView检测到-drawRect:方法被调用,UIView 会给视图分配一个寄宿图,并且这个寄宿图的像素尺寸等于视图大小与contentsScale的乘积之值。
基于上条原因,如非必须切勿将一空-drawRect:方法置于UIView子类之下

  • -drawRect:方法的调用

视图出现在屏幕上的时候就会被自动调用
代码内容先调用CoreGraphics绘制寄宿图,之后缓存这些代码内容直到需要被更新(手动调-setNeedDisplay方法 )。

布局

  • position 和 anchorPoint

position: 图层在父图层的哪一个位置
anchorPoint:该图层的哪一个点在父图层指定的点上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容