Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't hide share button in USDZ + QLPreviewController

I got a project that involves a few USDZ files for the augmented reality features embedded in the app. While this works great, and we're really happy with how it performs, the built-in share button of the QLPreviewController is something that we'd like to remove. Subclassing the object doesn't have any effect, and trying to hide the rightBarButtonItem with the controller returned in delegate method still shows the button when a file is selected. The implementation of USDZ + QLPreviewController we're using is pretty basic. Is there a way around this issue?

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)   
}  
like image 230
iOS.Lover Avatar asked Mar 19 '26 18:03

iOS.Lover


2 Answers

This is the official answer from Apple. Use ARQuickLookPreviewItem instead of QLPreviewItem. And set its canonicalWebPageURL to a URL (can be any 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
    }

The version check is optional.

like image 66
Wendell Avatar answered Mar 21 '26 12:03

Wendell


My approach is to add the QLPreviewController as an subview.

container is an UIView in storyboard.

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)

The y offset of the frame's origin and size may vary. This will ensure the AR QuickLook view to be the same size as the UIView, and hide the buttons (unfortunately, all of them) at the same time.

like image 28
CrypticalV Avatar answered Mar 21 '26 14:03

CrypticalV