UIDynamicAnimator items(in:) 在 iOS 11 中崩溃
Posted
技术标签:
【中文标题】UIDynamicAnimator items(in:) 在 iOS 11 中崩溃【英文标题】:UIDynamicAnimator items(in:) crashes in iOS 11 【发布时间】:2017-08-19 18:14:20 【问题描述】:在 ios 11(Xcode 9 beta 5)中,我调用 UIDynamicAnimator 的 items(in:)
方法并立即崩溃:
NSArray 元素未能匹配 Swift Array 元素类型
发生了什么事?
【问题讨论】:
【参考方案1】:您发现了一个错误。 (提交给 Apple,雷达 33979954。)希望它会尽快修复,但在那之前,这里是修复:
extension UIDynamicAnimator
func views(in rect: CGRect) -> [UIView]
let nsitems = self.items(in: rect) as NSArray
return nsitems.flatMap$0 as? UIView
现在拨打view(in:)
而不是items(in:)
,一切都会好起来的。
问题是虚假对象被放入从items(in:)
返回的数组中。由于这些虚假对象,数组无法跨过从 Objective-C 到 Swift 的桥梁;返回的数组在 Swift 中输入为 [UIDynamicItem]
,但该数组包含的东西不是 UIDynamicItem 对象。
扩展程序通过不过桥来解决此问题。我们留在 NSArray Objective-C 世界中,过滤掉虚假对象,然后然后过桥。
【讨论】:
以上是关于UIDynamicAnimator items(in:) 在 iOS 11 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章
UIDynamicAnimator、removeAllBehaviors() 第一次不起作用
如何在 applicationDidEnterBackground 中停止 UIDynamicAnimator
将 CGAffineTransformScale 与 UIAttachmentBehavior (UIDynamicAnimator) 一起使用