Ios 在UIView动画期间,如何设置UIView层的子层动画?

Ios 在UIView动画期间,如何设置UIView层的子层动画?,ios,uiview,calayer,uiviewanimation,cabasicanimation,Ios,Uiview,Calayer,Uiviewanimation,Cabasicanimation,在视图的UIView动画中,可以通过在[UIView animateWithDuration:delay:options:animations:completion:的选项参数中包含UIView AnimationOptionLayoutSubviews来设置其布局子视图的动画。然而,我找不到一种方法来设置它的动画,当它的子层不是某个视图的背景层时;它们只需跳到位,以匹配视图的新边界。由于我使用的是层而不是视图,因此我似乎必须使用核心动画而不是UIView动画,但我不知道如何(以及何时)这样做,

在视图的UIView动画中,可以通过在
[UIView animateWithDuration:delay:options:animations:completion:
的选项参数中包含
UIView AnimationOptionLayoutSubviews
来设置其布局子视图的动画。然而,我找不到一种方法来设置它的动画,当它的子层不是某个视图的背景层时;它们只需跳到位,以匹配视图的新边界。由于我使用的是层而不是视图,因此我似乎必须使用核心动画而不是UIView动画,但我不知道如何(以及何时)这样做,以便层动画与视图动画匹配

这是我的基本问题。如果您想了解我想要完成的具体任务,请阅读更多内容。

我通过在视图的层中添加一个CAShapeLayer,创建了一个带有虚线边框的视图(请参见此stackoverflow问题:)。我调整CAShapeLayer的路径以匹配
layoutSubviews
中视图的边界

这是可行的,但有一个表面问题:当视图的边界在UIView动画中设置动画(如在旋转过程中)时,虚线边界跳到视图的新边界,而不是在视图设置其边界动画时平滑设置其动画。也就是说,当视图设置动画时,虚线边框的右侧和底部不会分别与视图的右侧和底部保持拥抱。如何从CAShapeLayer获取虚线边框,以便在视图的边界设置动画时沿视图设置动画

到目前为止,我所做的是将CABasicAnimation附加到CAShapeLayer:

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.borderLayer.path = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
    self.borderLayer.frame = self.bounds;

    CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
    [self.borderLayer addAnimation:pathAnimation forKey:nil];
}

这确实会导致虚线边框设置动画,但它没有与视图动画匹配的正确计时功能和动画持续时间。此外,有时,我们不希望虚线边框像这样设置动画,当视图第一次进行布局时,边框不应该从某个旧路径设置动画到新的正确路径;它应该会出现。

你可能已经找到了答案,但我最近也遇到了类似的问题,因为解决了它,我将发布答案

-layoutSubViews
方法中,您可以使用
-animationForKey:
方法获取当前
UIView
动画作为背景层的
CAAnimation
。 使用此选项,您可以实现
-layoutSubviews
,如:

- (void)layoutSubviews {
    [super layoutSubviews];

    // get current animation for bounds
    CAAnimation *anim = [self.layer animationForKey:@"bounds"];

    [CATransaction begin];
    if(anim) {
        // animating, apply same duration and timing function.
        [CATransaction setAnimationDuration:anim.duration];
        [CATransaction setAnimationTimingFunction:anim.timingFunction];

        CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"path"];
        [self.borderLayer addAnimation:pathAnimation forKey:@"path"];
    }
    else {
        // not animating, we should disable implicit animations.
        [CATransaction disableActions];
    }

    self.borderLayer.path = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
    self.borderLayer.frame = self.bounds;
    [CATransaction commit];
}

我不得不使用“position”属性来获得animationForKey,但除此之外,它对我来说非常有用!谢谢,但我应该提到,这不适用于动画方法[UIView animateWithDuration:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:@Eric您也可以使用
bounds.size
。快速断点和检查动画关键点告诉我,如果我的UIView动画代码没有一个清晰的关键点路径可供参考,例如在
UIView.animationWithDuration:
内调用
layoutifneed()
有3个动画正在进行中
[position,bounds.size,bounds.origin]
@rintaro,您知道此场景中的解决方案吗?如果您试图在键盘显示/隐藏动画的同时设置动画,则此解决方案不起作用。。。(持续时间和计时功能不同)