我目前正在开发一个ARKit应用,希望该应用将允许用户从其照片库中选择要在ARImageTrackingSession中跟踪的图像。该应用程序当前已预先编程为在用户首次启动该应用程序时跟踪AR Resources中的图像,并且效果很好。当我切换到另一个ViewController时,让用户从他们的库中选择一张图像并最终提交该图像以进行跟踪时,我遇到了错误。当我关闭“选择您的跟踪图像视图”并尝试重置ARSession时,它说”Unexpectedly found nil while unwrapping an optional value”.
(我认为)在执行此步骤之前,我已经安全地解开了所有可选内容,并且我使用了breakpoint和许多控制台打印,只是为了确保在我尝试重置该选项之前,没有返回零。会议。我什至逐个字符地比较了看似有错误的会话与首次启动应用程序时成功调用的图像跟踪会话的比较,它们看起来与我非常相似。 This is how the two session objects look in the console.顶部的一个在应用程序启动时成功,底部的一个不成功。
我能想到的两个会话初始化之间唯一的大区别是,第一个使用XCode中AR资源文件夹中的图像,第二个(显然是错误的)使用用户提交的图像进行转换从UIImage到ImageData(以将数据存储在UserDefaults中),然后将其转换为CGImage以在ARImageTrackingConfiguration中使用。这是我转换图像并初始化ARReferenceImage的方式,然后再遇到错误。
func resetCustomTracking() {
let customTrackingConfig = ARImageTrackingConfiguration()
if let imageData = UserDefaults.standard.data(forKey: "customCard") {
if let uiImage = UIImage(data: imageData) {
if let ciImage = CIImage(image: uiImage) {
if let cgImage = convertCIImageToCGImage(inputImage: ciImage) {
let trackingImage = ARReferenceImage.init(cgImage, orientation: CGImagePropertyOrientation.up, physicalWidth: 0.0889)
trackingImage.name = "customImage"
let trackingImages: Set = [trackingImage]
customTrackingConfig.trackingImages = trackingImages
customTrackingConfig.maximumNumberOfTrackedImages = 1
print(customTrackingConfig)
session.run(customTrackingConfig, options: [.resetTracking, .removeExistingAnchors])
}
}
}
}
}
这是/何时调用resetCustomTracking的方式:这里,imageView已经包含了我要发送到ARImageTrackingConfiguration的图像。
@IBAction func createTapped(_ sender: Any) {
if imageView.image == UIImage(named: "Touch to submit design") {
let alertController = UIAlertController(title: "No design submitted", message: "You have to submit a design, silly.", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .default)
alertController.addAction(action)
self.present(alertController, animated: true, completion: nil)
}
else {
if let imageData = imageView.image?.pngData() {
UserDefaults.standard.set(imageData, forKey: "customCard")
}
}
UserDefaults.standard.set(nameField.text, forKey: "name")
UserDefaults.standard.set(webField.text, forKey: "personalWeb")
UserDefaults.standard.set(linkedInField.text, forKey: "linkedIn")
UserDefaults.standard.set(twitterField.text, forKey: "twitter")
UserDefaults.standard.set(gitHubField.text, forKey: "gitHub")
UserDefaults.standard.set(true, forKey: "usesCustomCard")
self.dismiss(animated: true, completion: nil)
ViewController().resetCustomTracking()
}
以前有人这样做过(即让用户提交图像进行跟踪)吗?还是有人可能对我可以尝试解决的问题有所了解?我很高兴获得所有建议,因为我已经盯着这个问题已有一段时间了。