5

由于某些原因,我试图避免使用 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

4 回答 4

3

“爸爸”有正确的答案。

您想创建一个 CAShapeLayer,并将其作为蒙版安装在您的图层上。

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

然后,您创建一个为路径设置动画的动画。

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

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

于 2012-04-27T02:41:42.387 回答
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];
于 2012-04-26T20:08:53.980 回答
2

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

于 2012-04-26T19:36:41.150 回答
0

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

于 2012-04-26T19:18:47.387 回答