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

标签 ios uikit-dynamics

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

NSArray元素与Swift Array元素类型不匹配

这是怎么回事?

最佳答案

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

关于ios - UIDynamicAnimator项目(in :)在iOS 11中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45774897/

相关文章:

ios - 使用动画生成插值

ios - 如何使用 AWS Rekognition 在 Swift 3 中比较人脸

iOS官方待办教程: List View Controller does not display correctly

ios - 具有附件和推送行为的 UIDynamicKit 会导致较长的振荡时间

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

ios - 自动布局、UIDynamics 和动画

ios - UIKit 动力学中的 CGGeometry 计算

javascript - 使用 React-Native AsyncStorage 通过应用程序更新在 App Store/Google Play 中存储数据

objective-c - UIView动画改变按钮的大小

ios - 将 UITouch 管理从 TouchBegan 切换到 UIScrollViewDelegate