UIDynamicAnimator项目(在:)中崩溃在iOS 11中

时间:2017-08-19 18:14:21

标签: ios uikit-dynamics

在iOS 11(Xcode 9 beta 5)中,我调用了UIDynamicAnimator的items(in:)方法并立即崩溃:

  

NSArray元素无法匹配Swift数组元素类型

发生了什么?

1 个答案:

答案 0 :(得分:2)

您发现了一个错误。 (提交给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世界,过滤掉虚假对象,然后过桥。