swift - 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)
解决方案
这在 2.5 年后在 iOS 14.2 的 SceneKit 中仍然被打破。我能说的最好的情况是,在节点至少渲染一次之前,您不能在具有 SCNText 几何的节点上调用 .boundingBox 。我的猜测是,在渲染循环和 boundingBox 无法检查它是否未初始化之前,某些东西不会被初始化。
我的解决方法是将 .boundingBox 放在 DispatchQueue.main.asyc {} 块中的常用技巧,因此(希望)节点和几何图形已被初始化。根据您的应用程序,这可能不可行。
推荐阅读
- java - Can't run my java .exe program. How do I troubleshoot this ? ("A Java exception has occured") and JNI problem
- java - @Repository 注解如何在 Spring MVC 内部工作?
- javascript - Building webpack vendor files in subdirectories
- reporting-services - 无法配置 SQL Server 报告服务 2017
- bitbucket - 在 Dataflow 工作人员上使用 SSH 密钥来拉取私有库
- angularjs - AngularJS 在模板中向用户反馈 $http 时遇到问题
- python - Python 3.4 支持已被弃用,无法安装 python 模块,使用 pip 命令
- javascript - 做出反应。从表中删除特定行
- c# - 具有一个 1:1 关系和 1:many 的实体 - 设置外键
- swift - 用 ios swift 将字符串文本替换为数组字符串中的特定文本