1

我正在开发具有 AR 功能的 iOS 购物应用程序。用户可以使用 iOS Quicklook 在 AR 中预览产品。AR 模型是 usdz 文件。

由于应用程序/设计要求,我不得不在 Quicklook 屏幕上添加自定义视图。用户应该能够在 AR Quicklook 屏幕中选择颜色,因此我创建了一个从 QLPreviewController 派生的新视图控制器并添加了一些 UI 组件(集合视图、按钮等)。我对每种颜色都有不同的模型,所以当用户选择颜色时,应用程序应该加载不同的模型(usdz 文件)。这是代码片段。

class ARViewController: QLPreviewController {
    override func viewDidLoad() {
        // add UI elements here (collectionview, buttons, ..)
    }
}

到目前为止一切都很好。我可以打开 AR Quicklook 并且可以第一次放置对象。

问题是

  • 当我通过选择 collectionview 单元更改产品时,Quicklook 会自动切换到“对象”视图,即使之前的模型在 AR 屏幕(相机)中
  • AR 屏幕(相机)变为禁用状态。我再也看不到 AR 屏幕上的新模型了。我必须关闭 AR 屏幕才能响应 AR 模式。或者有时我必须重新启动应用程序(只是关闭 QLPreviewController 不适用于下一个 AR 视图)。

这是 QLPreviewDataSource 代码

class ViewController: QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1 // I did try to update this number but did not worked
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        let productUrl = getProductUrl()
        return productUrl as QLPreviewItem // I did try to pass ARQuickLookPreviewItem but same issue
    }
}

当用户在 Quiclook 中点击 collectionViewCell 时,我只是更新了 AR 模型名称并调用了 QLPreviewController 的 reloadData 函数。

self.reloadData() // Also tried self.refreshCurrentPreviewItem() but same issue

任何帮助将不胜感激。谢谢!

4

1 回答 1

0

查看解决方案以检查您是否相应地实现了 QLPreviewController 委托方法。您可以在 ARViewController 的扩展中使用它们来获取下面发布的代码。

除了上述之外,下面的代码片段一定会有所帮助。这不完全是你的情况,但它有效。我在这里使用了 TableView 控制器和一个名为 ARObjectTableViewCell 的单独 XIB 文件。

class ARViewController: UITableViewController {
    
    let models = ["model_01","model_02","model_03"]
    var selectedIndex: Int = 0
        
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let xib = UINib(nibName: "ARObjectTableViewCell", bundle: nil)            
        self.tableView.register(xib, 
                       forCellReuseIdentifier: "objectDetailCell")
    }
    
    override func tableView(_ tableView: UITableView,
          numberOfRowsInSection section: Int) -> Int {
        return self.models.count
    }
    
    override func tableView(_ tableView: UITableView,
                 cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell: ARObjectTableViewCell = tableView.dequeueReusableCell(
                        withIdentifier: "objectDetailCell",
                                   for: indexPath) as! ARObjectTableViewCell
        
        let modelName = models[indexPath.row]
        cell.modelLabel.text = modelName.uppercased()
        
        if let image = UIImage(named: "\(modelName)") {
            cell.modelImageView.image = image
        }
        return cell
    }
    
    override func tableView(_ tableView: UITableView,
         heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 150.0
    }
    
    override func tableView(_ tableView: UITableView,
               didSelectRowAt indexPath: IndexPath) {
        
        tableView.deselectRow(at: indexPath,
                        animated: true)
        
        self.selectedIndex = indexPath.row
        
        let previewController = QLPreviewController()
        previewController.delegate = self
        previewController.dataSource = self
        self.present(previewController, animated: true)
    }
}
于 2021-11-23T11:50:27.777 回答