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 中的动画错误的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar 与状态栏动画过渡错误 ios7

iOS 内存优化

带有dismissViewControllerAnimated的iOS 8错误:完成:动画?

Detox IOS - 由于连续动画错误导致测试失败,disableSynchronization 不起作用

使用cordova 进行谷歌登录将无法正常工作。 Android中的错误10和IOS中的错误请求

在 iOS11 中动画细节时顶部 UINavigationController 的奇怪填充