Ios 在UIView动画期间,如何设置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 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,您知道此场景中的解决方案吗?如果您试图在键盘显示/隐藏动画的同时设置动画,则此解决方案不起作用。。。(持续时间和计时功能不同)