UIView的图层蒙版动画设置框架

时间:2017-07-27 16:41:24

标签: ios objective-c iphone uiview calayer

我想创建一个掩盖自身的UIView子类,以便我添加到它的任何子视图都被圆圈裁剪。我希望这个视图和它的子视图在IB中定义,这样我就可以轻松地为子视图定义布局约束。到目前为止,我有以下内容......

@interface BubbleView ()
// eg: this is an example of a child view that would be "under" a mask
@property(weak,nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation BubbleView

// not really sure if this kind of init is the right pattern, but it seems to work and 
// I don't think this is my current problem??
+ (instancetype)bubbleViewFromNib {
    BubbleView *view = [[NSBundle mainBundle] loadNibNamed:@"BubbleView" owner:nil options:nil][0];

    UIImage *_maskingImage = [UIImage imageNamed:@"circlemask"];
    CALayer *maskingLayer = [CALayer layer];
    [view.layer addSublayer:maskingLayer];

    maskingLayer.contents = (__bridge id _Nullable)(_maskingImage.CGImage);
    view.layer.mask = maskingLayer;

    return view;
}

- (void)layoutSubviews {
    self.layer.mask.frame = self.bounds;
}

(注意:我在IB中给出了紫色的视图,这样我才能看到正在发生的事情)

这几乎可以工作,但是当拥有的视图控制器调整此视图的大小时,就像这样......

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    BubbleView *b = (BubbleView *)[self.view viewWithTag:222];
    //b.transform = CGAffineTransformScale(b.transform, 1.2, 1.2);
    b.frame = CGRectInset(b.frame, -30,-30);
}

面具做了一些奇怪的事情:它保持小而且#34;跳跃&#34;在视图的左上角,然后很快动画到正确的大小(更大30,30)。 为什么要制作动画?

之前...

enter image description here

这样的快速动画......

enter image description here

将NSLog放置在layoutSubviews中,我注意到它被调用两次,这很奇怪,但仍然没有足够的时间来解释快速动画。

此外,当我更改变换而不是帧时,它会完美调整大小,没有动画。但我需要同时进行框架和变换。

有人可以告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

设置图层的可动画属性时,除非该图层是UIView的主图层,否则隐式动画是默认的。此外,frame属性仅仅是boundsposition属性的外观。因此,您不应该直接设置图层frame;始终自己设置boundsposition。如果您不想要动画,则需要关闭这些属性的隐式动画;最简单的方法是完全关闭当前的CATransaction(setDisableActionstrue),但有更微妙和精确的方法来完成同样的事情。