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 中被取消