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

zak*_*ces 6 core-animation objective-c uiview uiviewanimation ios

我有一个带有几个自定义绘制子层的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];
Run Code Online (Sandbox Code Playgroud)

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

小智 7

设置contentModeUIViewContentModeRedraw您正在动画的视图.


aLe*_*ion 4

图层不像视图那样工作。如果您在父图层上调用 setNeedsDisplay(如果您将 needDisplayOnBoundsChange 设置为 YES,则会发生这种情况),它将不会影响子图层。您还需要调用 setNeedsDisplay 它们。

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

  • 你是对的,但它仍然没有解决调整图层/子图层大小和重新绘制图层/子图层之间存在很大差异的事实。我的问题是,图层(即使有有效的委托和needsDisplayOnBoundsChange = YES)在边界动画时也不会调用它们的drawLayer:方法。 (2认同)