Canoe

iOS核心动画实践二(图层几何学)

2017.06.18

布局

View的三个属性:frame,bounds,center,对应 CALayer 的三个属性:frame,bounds,position。
具体的不再介绍,有一种特殊情况 frame 和 bounds 不一致。

锚点anchorPoint

实际就是 Layer 的支点,官方文档描述如下

/* Defines the anchor point of the layer’s bounds rect, as a point in
 * normalized layer coordinates - ‘(0, 0)’ is the bottom left corner of
 * the bounds rect, ‘(1, 1)’ is the top right corner. Defaults to
 * ‘(0.5, 0.5)’, i.e. the center of the bounds rect. Animatable. */

实践可以用于视图以一个点做旋转时,例如时钟指针。
当设置为(0,0)时以左下角为支点。

UIImage *image = [UIImage imageNamed:@"Taco"];
    MYTestLayer *layer = [[MYTestLayer alloc] init];
    layer.backgroundColor = [UIColor redColor].CGColor;
    layer.frame = CGRectMake(100, 100, 100, 100);
    [self.view.layer addSublayer:layer];
    layer.contents = (__bridge id _Nullable)(image.CGImage);
    
    layer.anchorPoint = CGPointMake(0, 0);
    layer.affineTransform = CGAffineTransformMakeRotation(M_PI_2);
    
    [layer display];

坐标系

对于坐标系的转换,系统给我们提供了一些方法

- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;

Z坐标轴

CALayer 存在三维坐标中,还有 zPoint 属性和 anchorPointZ。
我们在 layer 上覆盖另一个 layer,实际是在 z 轴上放置一个 layer 在前面,只要改变底层 layer 的z坐标,一个像素或者0.1,甚至0.0001也可以将layer前移,从而展示在前面。

Hit Testing

CALayer并不关心任何相应链事件,所以不能直接处理触摸事件,但是它有一系列方法帮我们处理事件:containsPointhitTest
-containsPoint:接受一个在本图层坐标系下的CGPoint,如果这个点在图层frame范围内就返回YES。
-hitTest: 方法同样接受一个CGPoint类型参数,而不是BOOL类型,它返回图层本身,或者包含这个坐标点的叶子节点图层。

Comments
Write a Comment