我在UIView的drawRect方法中绘制了一条路径。在某些情况下,路径会消失,我想要为此设置动画 - 让我们称之为“未绘制”路径。
对于动画,我正在创建一个CAShapeLayer,给它myPath然后设置一个CABasicAnimation(animationWithKeyPath:@“strokeEnd”)。
我的问题是如何从drawRect中绘制的内容切换到动画。我必须从drawRect中抽取myPath并调用setNeedsDisplay - 否则动画将被drawRect绘制的路径隐藏。
- (void)animationDidStart:(CAAnimation *)theAnimation
{
myPath = nil;
[self setNeedsDisplay];
}
但是这样我看到了我的路径,然后快速闪烁而没有路径,然后路径再次由CoreAnimation渲染,很好地未绘制。
我可以做得更好,以避免闪烁吗?
背景 这就是我设置动画的方式:
- (void) startAnimation
{
pathLayer.path = myPath.CGPath;
pathLayer.hidden = false;
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = 1;
pathAnimation.fromValue = [NSNumber numberWithFloat:1.0f];
pathAnimation.toValue = [NSNumber numberWithFloat:0.0f];
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
pathAnimation.delegate = self;
[pathLayer addAnimation:pathAnimation forKey:@"strokeEnd"];
}
答案 0 :(得分:1)
我相信闪烁的原因是当你调用
时运行的隐式动画pathLayer.hidden = NO;
默认情况下,独立CALayers会隐式地为大多数属性更改设置动画。如果禁用隐藏属性的隐式动画,它应该在没有闪烁的情况下运行(无论您使用drawRect:
还是drawLayer:inContext:
):
[CATransaction begin];
[CATransaction setDisableActions:YES];
pathLayer.hidden = NO;
[CATransaction commit];
答案 1 :(得分:0)
这是我的解决方案:不要将UIKits drawRect与CAAnimation结合使用,而是将其绘制到CALayer中:
- (void)drawLayer:(CALayer *)theLayer inContext:(CGContextRef)theContext
这允许从绘图到动画的无闪烁切换。