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() 第一次不起作用

减慢 UIDynamicAnimator 的动画

如何在 applicationDidEnterBackground 中停止 UIDynamicAnimator

将 CGAffineTransformScale 与 UIAttachmentBehavior (UIDynamicAnimator) 一起使用

使用自动布局时使用 UIDynamicAnimator 制作动画

如何暂停和恢复 UIDynamicAnimator 物理模拟