我得到了一个项目,该项目涉及应用程序中嵌入的增强现实功能的几个USDZ文件。虽然这很好用,而且我们对它的性能非常满意,但QLPreviewController的内置共享按钮是我们想要删除的。对对象进行子类化没有任何效果,当选择文件时,尝试用委托方法中返回的控制器隐藏rightBarButtonItem仍然会显示按钮。我们使用的USDZ+QLPreviewController的实现非常基础。有办法解决这个问题吗?
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let url = Bundle.main.url(forResource: models[selectedObject], withExtension: "usdz")! controller.navigationItem.rirButtonItems = nil.
// <- no effect return url as QLPreviewItem
}
@IBAction func userDidSelectARExperience(_ sender: Any) {
let previewController = QLPreviewController()
previewController.dataSource = self
previewController.delegate = self
present(previewController, animated: true)
}
这是苹果的官方答案。使用ARQuickLookPreviewItem而不是QLPreviewItem。并将其规范的WebPageURL设置为URL(可以是任何URL(。
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
guard let path = Bundle.main.path(forResource: "Experience", ofType: "usdz") else { fatalError("Couldn't find the supported input file.") }
let url = URL(fileURLWithPath: path)
if #available(iOS 13.0, *) {
let item = ARQuickLookPreviewItem(fileAt: url)
item.canonicalWebPageURL = URL(string: "http://www.google.com")
return item
} else { }
return url as QLPreviewItem
}
版本检查是可选的。
我的方法是添加QLPreviewController作为子视图。
container
是故事板中的一个UIView。
let preview = QLPreviewController()
preview.dataSource = self
preview.view.frame = CGRect(origin: CGPoint(x: 0, y: -45), size: CGSize(width: container.frame.size.width, height: container.frame.size.height+45) )
container.addSubview(preview.view)
preview.didMove(toParent: self)
帧的原点和大小的y偏移可能会有所不同。这将确保AR QuickLook视图与UIView的大小相同,并同时隐藏按钮(不幸的是,所有按钮(。
不返回QLPreviewItem
,而是使用符合此协议的ARQuickLookPreviewItem
。
https://developer.apple.com/documentation/arkit/arquicklookpreviewitem
然后,在canonicalWebPageURL
属性中指定您想要共享的url(将显示在共享工作表中(。默认情况下,此属性共享文件url(在本例中为USDZ文件url(。这样做不会暴露您的文件URL。
TLDR:我认为你做不到。
我还没有看到任何WWDC会议提到这一点,而且我似乎找不到任何支持开发人员的文档。我很确定ARKit QLPreviewController的重点是让您不必在AR端进行任何实际编码。我可以看到这一点和定制的吸引力,然而,我建议看看苹果发布的其他一些ARKit项目,并尝试从头开始重新创建这些项目,而不是将其剥离。
如果这种情况发生变化,请告知,因为我想做类似的事情,尤其是在Safari中。
我根本无法访问共享按钮来隐藏或禁用它。我花了几天时间来克服这个问题。我做了一种相当不专业的方法来克服它。将QLPreviewController子视图为ViewController,并将按钮或视图子视图放在共享按钮的顶部,并将我的公司徽标设置为图像。它会一直在那里,甚至在AR模式下,顶部的栏也会隐藏在全屏上。不是一个干净的解决方案。但有效。