首页 > 解决方案 > getBoundingBoxSize 有时会崩溃

问题描述

getBoundingBoxSize我在几何上使用时遇到了一个奇怪的问题SCNText- 它有时会导致崩溃 - EXC_BAD_ACCESS (code=1)。想不通为什么。我在主线程上使用它。

在此处输入图像描述

这发生在 iOS 12 上。有人可以帮我解决这个问题吗?

        let node = node as! AugmentedRealityView3DObjectNode
        let mediaNode = mediaNode as! SCNNode
        let fontScalling:   Float = 0.5 
        let marginScalling: Float = 0.9 
        let planeGeometry = mediaNode.geometry as! SCNPlane
        let textNode = mediaNode.childNodes.first!
        let mediaTextGeometry = textNode.geometry as! SCNText
        mediaTextGeometry.containerFrame = CGRect(withSize: CGSize(fromSize3D: node.augmentedRealityView.sizeForMainNode(node: node)) / CGFloat(fontScalling * marginScalling), centeredInContainerOfSize: .zero)
        let centerPoint = SCNVector3(getBoundingCenterPoint: mediaTextGeometry.boundingBox)
        textNode.position = SCNVector3(-centerPoint.x, -centerPoint.y, -centerPoint.z) * fontScalling * marginScalling
        textNode.scale = SCNVector3(qubicVector: fontScalling * marginScalling)
        // TODO: This causes crashes sometines in iOS 12.
        let boundingBoxSize = SCNVector3(getBoundingBoxSize: mediaTextGeometry.boundingBox) * fontScalling / marginScalling
        planeGeometry.width = CGFloat(boundingBoxSize.x)
        planeGeometry.height = CGFloat(boundingBoxSize.y)

标签: swiftcrashscenekitexc-bad-access

解决方案


这在 2.5 年后在 iOS 14.2 的 SceneKit 中仍然被打破。我能说的最好的情况是,在节点至少渲染一次之前,您不能在具有 SCNText 几何的节点上调用 .boundingBox 。我的猜测是,在渲染循环和 boundingBox 无法检查它是否未初始化之前,某些东西不会被初始化。

我的解决方法是将 .boundingBox 放在 DispatchQueue.main.asyc {} 块中的常用技巧,因此(希望)节点和几何图形已被初始化。根据您的应用程序,这可能不可行。


推荐阅读