UIViewPropertyAnimator在iOS10和iOS11上反转动画的不同行为。 `isReversed`和`fractionComplete`属性的错误?

问题描述 投票:10回答:2

问题 在iOS10和iOS11上运行相同的代码,我的UIViewPropertyAnimator在改变他的.isReversed属性后就有了不同的行为。 在iOS10上一切都很好。动画问题发生在iOS11上

条件 对于任何动画都是如此,不仅对于特定的动画,它都可以通过观看动画和代码来验证。它发生在模拟器和真实设备上。

细节 一旦用他的动画创建了一个UIViewPropertyAnimator,在它运行期间我只需调用.pauseAnimation()并将.isReversed属性更改为true。之后我恢复了动画调用:

continueAnimation(withTimingParameters parameters: UITimingCurveProvider?, durationFactor: CGFloat)

在iOS10的这一点上,动画平滑地改变了他的诗句,在iOS11上它立即停止并且以一点帧滞后反转。

如果在代码中我检查.fractionComplete的值(在我的UIViewPropertyAnimator对象上调用,它在.continueAnimation(...之后让我回到动画完成百分比值,从0.0开始,到1.0结束) - 在iOS 10上,它会保留一段时间,就好像动画正在继续,并且只有在一段时间后跳到他的补充。 - 在iOS 11上,它突然跳起来补充 在文档上有与此相关的非更新,只是UIViewPropertyAnimator的几个新属性但未使用,因为我的目标是iOS10

可能是一个错误或我错过了什么!?


小更新:刚刚测试过,iOS 11.0.1和iOS 11.1 beta1上的行为相同

在评论中链接,这只发生在非线性曲线上!

ios uikit ios10 ios11 uiviewpropertyanimator
2个回答
6
投票

我一直在争论这个问题很长一段时间,但后来我注意到在iOS 11中添加到scrubsLinearlyUIViewPropertyAnimator属性:

默认为true。使动画师能够线性地或使用动画师的当前时间暂停和擦洗。

请注意,此属性的默认值为true,这似乎与使用非线性动画曲线产生冲突。这也可以解释为什么在使用线性定时功能时不存在该问题。

scrubsLinearly设置为false,动画师似乎按预期工作:

let animator = UIViewPropertyAnimator(duration: 0.25, curve: .easeOut) {
   ...
}
animator.scrubsLinearly = false

1
投票
  1. 在iOS 11上,在你通过fractionComplete反转动画后,1 - originalFractionComplete将被颠倒(即animator.isReversed = true)。
  2. 持续时间少于0.1秒的Spring动画将立即完成。

因此,您可能最初想要反转动画运行整个动画持续时间的90%,但在iOS 11上,反转动画实际上持续10%持续时间因为isReversed改变了,并且10%持续时间小于0.1s,所以动画将是立即完成,看起来没有动画发生。

怎么修?

对于iOS 10向后兼容性,请在反向动画之前复制fractionComplete值并将其用于continueAnimation

EG

let fraction = animator.fractionComplete
animator.isReversed = true
animator.continueAnimation(...*fraction*...)
© www.soinside.com 2019 - 2024. All rights reserved.