8

我可以像这样创建一个面具:

CALayer *mask = [CALayer layer];
    mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage];
    mask.frame = CGRectMake(0, 0, 10, 10);
    self.content.layer.mask = mask;

这将正确显示我内容的左上角 10 个像素(因为 mask.png 只是一个黑色图像)。但是我想为面具设置动画以显示其余内容:

 [UIView animateWithDuration:3.0
                     animations:^{
                         mask.frame = self.content.bounds;
                     }
                     completion:^(BOOL finished){

                     }];

问题是没有动画。整个内容会立即显示。为什么会发生这种情况,如何为蒙版设置动画以便从左上角显示内容?

4

1 回答 1

15

框架是各种其他属性的派生属性,例如位置、边界、锚点以及它应用于它的任何变换。不建议直接为该属性设置动画,尤其是在处理较低级别的 CoreAnimation 图层时。

在这种情况下,我假设您想要为边界设置动画。可以使用上面的 UIView 动画方法,但是直接处理 CALayers 时我更喜欢使用动画的 CoreAnimation 方法。

CGRect oldBounds = mask.bounds;
CGRect newBounds = self.content.bounds;

CABasicAnimation* revealAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"];
revealAnimation.fromValue = [NSValue valueWithCGRect:oldBounds];
revealAnimation.toValue = [NSValue valueWithCGRect:newBounds];
revealAnimation.duration = 3.0;

// Update the bounds so the layer doesn't snap back when the animation completes.
mask.bounds = newBounds;

[mask addAnimation:revealAnimation forKey:@"revealAnimation"];
于 2013-08-22T22:43:05.777 回答