向 UIDynamicAnimator 添加超过 32 个 UIFieldBehavior 会导致 SIGABRT

Posted

技术标签:

【中文标题】向 UIDynamicAnimator 添加超过 32 个 UIFieldBehavior 会导致 SIGABRT【英文标题】:Adding more than 32 UIFieldBehaviors to a UIDynamicAnimator causes a SIGABRT 【发布时间】:2018-07-10 17:00:28 【问题描述】:

我有以下代码。当我迭代 25 次 (5 * 5) 时,它工作正常。当我迭代 36 次(for 循环中的 6 * 6)时,它会因 SIGABRT 而崩溃。我已经粘贴了错误的图像(Xcode 中的 Playgrounds 不允许我复制粘贴它)。这是一个内部错误,是否在某处定义了 32 个行为的限制,或者这是我的代码中的一个错误?谢谢!

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController 
    var animator : UIDynamicAnimator!

    var springfields : [UIFieldBehavior] = []

    override func loadView() 
        let view = UIView()
        view.backgroundColor = .white
        animator = UIDynamicAnimator(referenceView: view)

        for i in 1...6 
            for j in 1...6 
                let newView = UIView()
                let dotwidth = 12
                newView.layer.cornerRadius = CGFloat(dotwidth/2);
                newView.frame = CGRect(x:20+i*25, y:20+j*25, width:dotwidth, height:dotwidth)
                newView.clipsToBounds = true
                newView.backgroundColor = .black

                let newSpringField = UIFieldBehavior.springField()
                springfields.append(newSpringField)
                newSpringField.addItem(newView)
                newSpringField.position = newView.center

                view.addSubview(newView)

                animator.addBehavior(newSpringField)
            
        

        self.view = view
    

// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
PlaygroundPage.current.needsIndefiniteExecution = true

【问题讨论】:

我假设它是一个溢出错误,但 Apple 并没有让它很容易知道。我认为当您在 25 和 36 之间进行迭代时,我认为当您进行 32 次迭代时(可以使用您正在进行的迭代的打印语句检查)它失败了。 【参考方案1】:

在应用程序中运行您的代码,调试控制台输出为:

*** 由于未捕获的异常“无效关联”而终止应用程序,原因:“UIDynamicAnimator 最多支持 32 个不同的字段”

【讨论】:

谢谢!我没有意识到 Playgrounds 中的错误消息比应用程序中的错误消息提供的信息更少。想知道为什么 Apple 会设置这个限制......

以上是关于向 UIDynamicAnimator 添加超过 32 个 UIFieldBehavior 会导致 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

第六课——UIDynamicAnimator

UIDynamicAnimator在swift 3中丢球循环

UIDynamicAnimator UIKit动力学

UIDynamicAnimator、removeAllBehaviors() 第一次不起作用

减慢 UIDynamicAnimator 的动画

如何在 applicationDidEnterBackground 中停止 UIDynamicAnimator