Я запускаю сеанс ARKit, в котором размещаю узлы SceneKit. С каждым узлом я создаю экземпляр нового контроллера представления и передаю его представление как содержимое узла следующим образом:
func createTextNode(anchor: ARCardAnchor) -> SCNNode? {
let plane = SCNPlane()
plane.height = 0.5
plane.width = 0.5
let sb = UIStoryboard(name: "Main", bundle: nil)
let fCVC = sb.instantiateViewController(withIdentifier: "CardViewController") as! CardViewController
plane.firstMaterial?.diffuse.contents = fCVC.view
let cardNode = SCNNode(geometry: plane)
cardNode.constraints = [billboardConstraint]
return cardNode
}
Я добавляю узлы в сцену, используя следующий метод ARSCNViewDelegate и свой собственный ARCardAnchor (подкласс ARAnchor):
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
if let fcanchor = anchor as? ARCardAnchor {
DispatchQueue.main.async {
guard let n = self.nodeCreator.createTextNode(anchor: fcanchor) else { return }
node.addChildNode(n)
}
}
}
Пока все работает и узлы размещены в трехмерном пространстве. Но когда я возвращаюсь к предыдущему контроллеру представления, пользовательский интерфейс зависает, и я ничего не могу сделать. Я пытался использовать раскрутку, как это
@IBAction func goBackToPrevious(_ sender: Any) {
sceneView.session.pause()
self.performSegue(withIdentifier: "unwindToPrevious", sender: self)
}
и контроллер навигации, где я извлекаю контроллер сцены AR из стека. Каждый раз, когда предыдущие контроллеры представления замораживаются. Ошибок в Xcode нет, приложение продолжает работать. Если я подожду ок. Через 2 минуты я снова могу пользоваться экраном. Если я не добавляю узлы с контроллерами представления в свою AR-сцену, все работает отлично. Мое единственное объяснение заключается в том, что UIThread перегружается при добавлении узлов, потому что где-то возникает массивная утечка памяти (которую я не обнаружил, несмотря на 10 часов отладки). Кто-нибудь имел подобный опыт и может сказать мне, как это решить? Что я могу сделать, чтобы отладить это и обеспечить плавную навигацию?