2012-04-26 53 views
5

由于某些原因,我试图避免使用CAScrollLayer来做到这一点。我所追求的效果是逐步揭示(从底部到顶部)一个CALayer的内容(我之前加载过的一个PNG)。所以我想这样做:我怎样才能让CAlayer的边界动画逐步显示图像?

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]; 

这个问题是你可以告诉图层的内容与边界缩放。我试图改变边界,但内容始终保持原始大小,以便边界能够有效地剪切图像,并随着边界的增加而变高。图像“显示”本身。

任何想法如何将其关闭或我可能会丢失什么?

回答

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]; 
0

您可以在目标图像上放置另一个图像并将其像舞台幕一样移动。

+0

我知道,但因为在一个以上的效率水平(可以有这些影响中的一小部分会立即发生,我需要自己处理CALayers)我决定不这样做。现在我正在试验contentRect,并且我能够把它弄到几乎正确。唯一的问题是内容rect动画时,我也得到了一种在图层内绘制的笔画轨迹。 – SaldaVonSchwartz 2012-04-26 19:21:08

+0

contentRect的文档说“如果请求单位矩形外的像素,内容图像的边缘像素将向外扩展”所以我想这就是为什么我得到笔画效果 – SaldaVonSchwartz 2012-04-26 19:30:29

2

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

3

“爸爸”有正确的答案。

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

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

然后,您创建一个动画动画路径。

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

您可以使用同样的技术来实现各种很酷的效果,像谷仓门,百叶窗,“虹膜湿巾”等

+0

感谢您的详细描述 – 2015-09-10 09:26:34

相关问题