Ios 正在从后台线程调用ARKit UIView SetAnimationEnabled
我有一个ARKit应用程序,可以显示图像。这些工作正常,但是如果我尝试使用来显示动画GIF,我会得到以下错误(如果需要,可以使用完整堆栈跟踪) 我找不到任何代码选择在后台线程上运行的地方。在我的代码中,Ios 正在从后台线程调用ARKit UIView SetAnimationEnabled,ios,swift,arkit,Ios,Swift,Arkit,我有一个ARKit应用程序,可以显示图像。这些工作正常,但是如果我尝试使用来显示动画GIF,我会得到以下错误(如果需要,可以使用完整堆栈跟踪) 我找不到任何代码选择在后台线程上运行的地方。在我的代码中,addImage()可以正常工作,但是addGIF()会导致上述错误。myViewController.swift的相关部分包括: import UIKit import ARKit class ViewController: UIViewController, ARSCNViewDelegat
addImage()
可以正常工作,但是addGIF()
会导致上述错误。myViewController.swift的相关部分包括:
import UIKit
import ARKit
class ViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var planeDetected: UILabel!
@IBOutlet weak var sceneView: ARSCNView!
let configuration = ARWorldTrackingConfiguration()
var portalDisplayed = false
override func viewDidLoad() {
super.viewDidLoad()
self.sceneView.debugOptions = [ARSCNDebugOptions.showFeaturePoints]
self.configuration.planeDetection = .horizontal
self.sceneView.session.run(configuration)
self.sceneView.delegate = self
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
self.sceneView.addGestureRecognizer(tapGestureRecognizer)
}
@objc func handleTap(sender: UITapGestureRecognizer) {
guard let sceneView = sender.view as? ARSCNView else {return}
let touchLocation = sender.location(in: sceneView)
let hitTestResult = sceneView.hitTest(touchLocation, types: .existingPlaneUsingExtent)
if !hitTestResult.isEmpty {
self.addPortal(hitTestResult: hitTestResult.first!)
} else {
//
}
}
func addPortal(hitTestResult: ARHitTestResult) {
self.portalDisplayed = true
self.sceneView.debugOptions = []
let portalScene = SCNScene(named: "Portal.scnassets/Portal.scn")
let portalNode = portalScene!.rootNode.childNode(withName: "Portal", recursively: false)!
let transform = hitTestResult.worldTransform
let planeXposition = transform.columns.3.x
let planeYposition = transform.columns.3.y
let planeZposition = transform.columns.3.z
portalNode.position = SCNVector3(planeXposition, planeYposition, planeZposition)
self.sceneView.scene.rootNode.addChildNode(portalNode)
...
// Using the commented line below instead means I don't get this error!
// self.addImage(nodeName: "box", portalNode: portalNode, imageName: "image")
self.addGIF(nodeName: "box", portalNode: portalNode, imageName: "image")
}
func addImage(nodeName: String, portalNode: SCNNode, imageName: String) {
let child = portalNode.childNode(withName: nodeName, recursively: true)
child?.geometry?.firstMaterial?.diffuse.contents = UIImage(named: "Portal.scnassets/\(imageName).jpg")
child?.renderingOrder = 300
}
func addGIF(nodeName: String, portalNode: SCNNode, imageName: String) {
let child = portalNode.childNode(withName: nodeName, recursively: true)
let gifImage = UIImage.gifImageWithName("\(imageName)")
let gifImageView = UIImageView(image: gifImage)
child?.geometry?.firstMaterial?.diffuse.contents = gifImageView
}
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard anchor is ARPlaneAnchor else {return}
DispatchQueue.main.async {
if self.portalDisplayed == false {
self.planeDetected.isHidden = false
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.planeDetected.isHidden = true
}
}
}
当调用上面链接中的代码时,有没有办法阻止这种情况发生?我也尝试了以下操作,但仍然出现相同的错误:
DispatchQueue.main.async {
self.addGIF(nodeName: "boxBW", portalNode: portalNode, imageName: "angel")
}
我已经检查了提出的一些问题(例如),但它们似乎没有回答这个特定问题。下面是代码作者建议的修复方法:下面是代码作者建议的修复方法:
DispatchQueue.main.async {
self.addGIF(nodeName: "boxBW", portalNode: portalNode, imageName: "angel")
}