iOS 10 中的动画错误
Posted
技术标签:
【中文标题】iOS 10 中的动画错误【英文标题】:Animation bug in iOS 10 【发布时间】:2016-09-16 20:32:15 【问题描述】:从 ios 10 开始,我注意到为布局更改 (layoutIfNeeded()
) 设置动画不是动画。这是我的 UIView 扩展,它适用于 iOS 9 及更低版本。
func slideIn(from edgeConstraint: NSLayoutConstraint, withDuration duration: Double = 0.25, finishedAnimating: (() -> Void)? = nil)
dispatch_async(dispatch_get_main_queue())
edgeConstraint.constant = 0
UIView.animateWithDuration(duration,
delay: 0.0,
options: .BeginFromCurrentState,
animations: self.layoutIfNeeded() ,
completion: didComplete in
finishedAnimating?()
)
func slideOut(from edgeConstraint: NSLayoutConstraint, withDuration duration: Double = 0.25, finishedAnimating: (() -> Void)? = nil)
dispatch_async(dispatch_get_main_queue())
edgeConstraint.constant = -self.frame.height
UIView.animateWithDuration(duration,
delay: 0.0,
options: .BeginFromCurrentState,
animations: self.layoutIfNeeded() ,
completion: didComplete in
finishedAnimating?()
)
有谁知道为什么它没有动画?
【问题讨论】:
你是不是在真机上也有问题? @DanLevy 是 iPhone 6S iOS 10.0.1 “工作不正常”是什么意思? @Aaron 它没有动画。它不是从一个点滑到另一个点,而是在没有任何动画的情况下跳转到最后一个点。 你在使用 Swift 3 吗? 【参考方案1】:在您的动画块中,您调用self.layoutIfNeeded()
,其中self
是您要设置动画的UIView
的实例。调用layoutIfNeeded()
会重绘调用该方法的视图以及所有子视图。在您的情况下,您不想重绘UIView
,而是要重绘视图的超级视图。
如果在视图控制器中调用您的函数将有意义并且可以正常工作,但由于它们是在 UIView
本身的扩展中调用的,因此您需要调用类似 view.superview?.layoutIfNeeded()
的东西
【讨论】:
这样就行了。但是为什么在 iOS 9 上不引用 superview 就可以了,而现在在 iOS 10 上却要指定 superview 呢? 该错误应该与操作系统无关,所以我不确定为什么它会在 iOS 9 上运行。 它实际上与操作系统无关。这曾经真正适用于 9 和更早的版本。这种新行为在 iOS10 上被引入 - ***.com/a/39548367/1045672 - 请参阅 Apple 发布说明。以上是关于iOS 10 中的动画错误的主要内容,如果未能解决你的问题,请参考以下文章
带有dismissViewControllerAnimated的iOS 8错误:完成:动画?
Detox IOS - 由于连续动画错误导致测试失败,disableSynchronization 不起作用