CALayer----寄宿图
2018-04-30 本文已影响0人
M_PI_4
寄宿图
- 什么是寄宿图
图层中包含的 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
- 去除像素化
- 定义寄宿图的像素尺寸和视图大小的比例
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:该图层的哪一个点在父图层指定的点上