当我为UIView的界限设置动画时,如何重绘UIView的子图层?

时间:2013-04-13 14:53:52

标签: ios objective-c uiview core-animation uiviewanimation

我有一个带有几个自定义绘制子图层的UIView(一些带有CAShapeLayer蒙版的CAGradientLayers等)。我正在使用UIView动画方法来动画它的边界(增加它的宽度和高度)。

[UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat animations:^{
    CGRect bounds = myView.bounds;
    bounds.size.width += 20;
    bounds.size.height += 20;
    myView.bounds = bounds;
} completion:nil];

这样可以正常工作,但子图层不会重新绘制动画。最好的方法是什么?我是否需要设置一些键值观察检测边界变化并在所有子图层上调用setNeedsDisplay?

2 个答案:

答案 0 :(得分:6)

在您要设置动画的视图上将contentMode设置为UIViewContentModeRedraw

答案 1 :(得分:4)

图层不像视图一样工作。如果在父图层上调用setNeedsDisplay(如果已将needsDisplayOnBoundsChange设置为YES,则会发生这种情况),它不会影响子图层。你也需要调用setNeedsDisplay。

如果在调整父图层大小时需要调整子图层大小,则在父图层中实现layoutSublayers(或者在其委托中使用layoutSublayersOfLayer:)。