如何动画CAlayer的边界以逐步显示图像?

时间:2012-04-26 18:34:37

标签: ios core-animation calayer

出于某些原因,我试图避免使用CAScrollLayer来执行此操作。我要追求的效果是逐步显示(从下到上)CALayer的内容(我之前加载的一个png)。所以我想这样做:

    layer.anchorPoint = CGPointMake(.5, 1);
    CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"];
    a.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    a.fillMode = kCAFillModeBoth;
    a.removedOnCompletion = NO;
    a.duration = 1;
    a.fromValue = [NSNumber numberWithFloat:0.];
    a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height];
    [layer addAnimation:a forKey:nil];

这个问题是你可以告诉图层的内容是用边界缩放的。我试图改变边界,但内容始终保持原始大小,以便有效地限制剪辑图像,并且当我增加bounds.height时,图像“显示”本身。

关于如何实现这一目标或者我可能缺少什么的任何想法?

4 个答案:

答案 0 :(得分:3)

好的,我得到了它的工作,但我基本上也必须更新图层的框架,以反映锚点的变化:

  [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
  layer.contentsGravity = kCAGravityTop;
  layer.masksToBounds = YES;
  layer.anchorPoint = CGPointMake(.5, 1);
  CGRect newFrame = layer.frame;
  newFrame.origin.y += newFrame.size.height / 2;
  layer.frame = newFrame;
  [CATransaction setValue:(id)kCFBooleanFalse forKey:kCATransactionDisableActions];

  a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height];
  [layer addAnimation:a forKey:nil];

答案 1 :(得分:3)

“爸爸”有正确的答案。

您想要创建一个CAShapeLayer,并将其作为图层的掩码安装。

您创建一个只是一个矩形的CGPath,并将该路径安装到形状图层中。路径的内容确定掩码层的哪些区域出现。如果路径是图层中间的三角形,则只显示三角形。

然后创建一个动画来制作路径的动画。

要从底部显示图像,您需要在图层底部设置一个0高度矩形的路径,然后创建一个CAAnimation,其中toValue是同一个矩形,高度为要显示的完整图层。系统将生成一个动画,以扫描图像显示图像。

您可以使用相同的技术来实现各种酷炫效果,如谷仓门,百叶帘,“虹膜擦拭巾”等。

答案 2 :(得分:2)

如果更改了剪贴蒙版怎么办? (或使用遮罩层)。

答案 3 :(得分:0)

您可以在目标图像上放置另一张图像,然后像舞台幕布一样向上移动。