ARSCNViewDelegate方法未触发问题求助
问题原因与解决方法
核心原因
你仅给ARSession设置了代理(self.arKitView.session.delegate = self),但未给ARSCNView本身设置代理。ARSCNViewDelegate的回调由ARSCNView触发,必须将其delegate属性指向实现该协议的对象(即你的ARSessionCameraView实例),否则不会触发相关方法。
另外存在场景适配问题:使用前置摄像头时,你配置的是ARFaceTrackingConfiguration,该配置不支持平面检测,所以即便代理设置正确,也不会产生ARPlaneAnchor相关的renderer回调——这类回调仅在后置摄像头开启平面检测的配置下才会触发。
解决步骤
1. 补充设置ARSCNView的代理
在setupARSession方法中添加一行代码,完成ARSCNView的代理绑定:
func setupARSession(position: AVCaptureDevice.Position) { if position == .back { let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = [.horizontal] configuration.userFaceTrackingEnabled = true self.arKitView.session.run(configuration) } else if position == .front { let configuration = ARFaceTrackingConfiguration() configuration.isWorldTrackingEnabled = true self.arKitView.session.run(configuration) } self.arKitView.session.delegate = self // 新增该行,绑定ARSCNView的代理 self.arKitView.delegate = self }
2. 匹配测试场景
- 若要测试平面检测相关的
renderer(_:didAdd:for:)和renderer(_:didUpdate:for:)回调,请切换至后置摄像头,并确保测试环境存在清晰平面(如桌面、地面)。 - 前置摄像头的
ARFaceTrackingConfiguration仅会产生ARFaceAnchor,若需处理人脸相关逻辑,可在renderer方法中判断anchor is ARFaceAnchor。
3. 额外验证(可选)
确认setupViews方法中创建的ARSCNView实例是最终添加到界面的对象——如果代理设置在了未被显示的实例上,同样会导致回调失效。需保证self.delegate?.viewsDidCreate(arKitView: arKitView)传递的是同一个arKitView,且该对象已正确加入视图层级。
内容的提问来源于stack exchange,提问作者narner
相关产品推荐
相关产品推荐

