Не удается скрыть кнопку "Поделиться" в USDZ + QLPreviewController
Я получил проект, включающий несколько файлов 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)
}
2 ответа
Это официальный ответ Apple. Используйте ARQuickLookPreviewItem вместо QLPreviewItem. И установите для его canonicalWebPageURL 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
}
Проверка версии не обязательна.
Вместо возвращения QLPreviewItem
, используйте ARQuickLookPreviewItem
который соответствует этому протоколу.
https://developer.apple.com/documentation/arkit/arquicklookpreviewitem
Затем назначьте URL-адрес, которым вы хотите поделиться (который появится на листе общего доступа) в canonicalWebPageURL
свойство. По умолчанию это свойство использует URL-адрес файла (в данном случае URL-адрес файла USDZ). Это не приведет к раскрытию URL-адресов ваших файлов.
Мой подход - добавить 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)
Смещения у происхождения и размера фрейма может изменяться. Это гарантирует, что представление AR QuickLook будет того же размера, что и UIView, и одновременно скроет кнопки (к сожалению, все).
Я не смог добраться до кнопки "Поделиться", чтобы скрыть или отключить ее. Потратил дни, чтобы преодолеть это. Я сделал довольно непрофессиональный способ его преодоления. Подпишите QLPreviewController на ViewController и подпишите кнопку или представление поверх кнопки общего доступа. Он будет там постоянно, даже в верхнем экране в режиме AR скрывается даже верхняя панель. Не чистое решение. Но работает.
TLDR: я не думаю, что ты можешь.
Я не видел ни одного сеанса WWDC, даже упомянув об этом, и я не могу найти никакой документации для разработчиков. Я почти уверен, что смысл ARKit QLPreviewController в том, что вам не нужно делать никакого реального кодирования на стороне AR. Я вижу привлекательность для этого и для настройки в целом, однако, я бы предложил вместо этого взглянуть на некоторые из других проектов ARKit, которые Apple выпустила, и попытаться воссоздать их с нуля, а не разбирать их на части.
Пожалуйста, сообщите, если это изменится, поскольку я хотел бы сделать что-то подобное, особенно в Safari.