我正在添加CAShapeLayer
一些CABasicAnimation
。我希望能够删除图层并再次绘制它,但我无法成功。
- (void)drawRect:(CGRect)rect {
[self drawLayer];
}
- (void)drawLayer {
if (_alayer && _layer.superlayer) {
[_alayer removeFromSuperlayer];
_alayer = nil;
}
_alayer = [[CAShapeLayer alloc] init];
_alayer.path = [self myPath].CGPath;
_alayer.strokeColor = [UIColor redColor].CGColor;
_alayer.fillColor = [UIColor clearColor].CGColor;
_alayer.lineWidth = 2.f;
_alayer.strokeStart = 0.f;
_alayer.strokeEnd = 1.f;
[self.layer addSublayer:_alayer];
// animate
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
animation.duration = 2.f;
animation.fromValue = @0.f;
animation.toValue = @1.f;
[_alayer addAnimation:animateStrokeEnd forKey:@"strokeEndAnimation"];
}
}
然而,在调用[self setNeedsDisplay];
后,即使它在drawLayer
方法中的断点处停止,片刻也不会消失并再次激活。 alayer
被声明为nonatomic, strong
属性。我做错了什么?
答案 0 :(得分:1)
你不应该叫[self drawLayer]; fromm drawRect:因为它是定期调用的。 使用其他viewDidLoad或从其他方法调用
编辑:
drawRect:应该仅用于绘图,我不知道如果你从那里添加动画它是否会起作用。
如果你想让它消失并出现,你应该尝试使用[self performSelector:withObject:afterDelay:]来添加延迟。
我认为更改隐藏或不透明度应该足够了,您只需要删除AllAnimations以确保不再有动画附加到该图层。
但是我认为你应该尝试其他方式而不是从drawRect调用drawLayer:因为我不管它是不是很好的做法。
答案 1 :(得分:0)
UIView默认拥有自己的属性layer。请尝试将变量名称更改为shapeLayer或其他名称。