UIView animate withDuration 不会在 iOS 9.3.5 上调用完成处理程序

Posted

技术标签:

【中文标题】UIView animate withDuration 不会在 iOS 9.3.5 上调用完成处理程序【英文标题】:UIView animate withDuration does not call the completion handler on iOS 9.3.5 【发布时间】:2017-09-14 21:08:07 【问题描述】:

我有这个动画块

  UIView.animate(withDuration: 0.5, animations:  
            self.holdingView.alpha = .5
        , completion:  (complete) in
            if complete 
                self.holdingView.removeFromSuperview()
            
        )
    

但无论出于何种原因,在运行 ios 9.3.5 的 iphone 和 itouch 上都不会调用完成处理程序,但奇怪的是,它会在运行 iOS 9.3.5 的 iPad Mini 上调用。

这很难调试,因为我在控制台中没有收到任何错误。此外,在所有 iOS 版本 > 9.3.5

上都会调用完成处理程序

任何帮助或见解将不胜感激。

【问题讨论】:

是完成处理程序没有被调用还是complete属性不是true的问题? (complete) in 下方/之后以及if complete ... 块之外编写一个打印语句,例如print("completion executed", complete)。打印语句将 1. 打印“完成执行”文本,2. 将为您提供 complete 的值。如果complete 为假,则表示您的动画尚未完成,因此不会触发您的 if 语句中的代码。 你需要在主线程上,所以我猜你是从后台线程调用它。 @rmaddy 未调用完成处理程序。我已经在动画闭包中设置了断点并且运行良好,并且在完成处理程序中设置了断点,但它从未达到那个点。另一件奇怪的事情是,这个问题似乎非常特定于设备和操作系统。在运行高于 9 的 iOS 的任何设备上一切正常,在运行 iOS 9 的 iPad 上运行良好。但此问题仅在运行 iOS 9.3.5 的 iPhone 和 iTouch 中存在。想知道这是否是已知问题。 你能在模拟器中重现这个吗? 【参考方案1】:

我刚刚遇到了类似的问题。我以串行的方式为我的视图设置动画。 我猜completionHandler 试图连接到之前的动画。我删除了所有动画如下,一切顺利。

在您的情况下,请尝试以下操作:

self.holdingView.layer.removeAllAnimations()
UIView.animate(withDuration: 0.5, animations:  
            self.holdingView.alpha = .5
        , completion:  (complete) in
            if complete 
                self.holdingView.removeFromSuperview()
            
        )
    

【讨论】:

以上是关于UIView animate withDuration 不会在 iOS 9.3.5 上调用完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

UIView Animation 中的 Alpha 变化没有影响,在 UIView Animation 之外很好

UIView.animateWithDuration:animations:completion: 在 XCTest 中被取消

NSLayoutConstraint 不使用 UIView.animate 进行动画处理

UIView.animate 和完成问题

给予uiview animation有哪几种动画曲线

UIView.animate() 无法为视图设置动画的各种原因都有哪些?