我使用 QLPreviewController 打开一个文件,以在 Xamarin.Forms iOS 应用程序中预览它。 我关闭了“打开方式”按钮,以防止将文件导出到 QLPreviewController 中的应用程序。但是,在我的测试设备 (iPad) 上进行最新的 iOS 更新后,我看到当按下导航栏中的标题时,会打开一个菜单,并显示“打开方式”选项。
如何关闭它?
对我来说唯一没有太多黑客攻击的解决方案是将
QLPreviewController
的视图添加为另一个父视图控制器的单个子视图。
这样你就可以添加任何你想要的导航或工具栏。请记住,每当 iOS 更新时,破解/更新/添加内容到现有的本机 UI 元素中可能会中断。
它看起来像那样,我用它来预览和共享 PDF 文件。 PDF文件之前下载到
fileURL
.
final class PreviewController: UIViewController, QLPreviewControllerDataSource {
/// The `QLPreviewController` hosting the PDF preview.
private var previewController = QLPreviewController(nibName: nil, bundle: nil)
/// The `URL` pointing to the device's filesystem.
let fileURL: URL
// MARK: - Init
/// Creates an instance of `PreviewController` showing the PDF file at the given path.
/// - Parameters:
/// - fileURL: The `URL` of the PDF file.
/// - title: The title to show on the view controller.
init(fileURL: URL, title: String?) {
self.fileURL = fileURL
super.init()
self.title = title
setShareButton()
previewController.dataSource = self
}
required init?(coder: NSCoder) { nil }
// MARK: - Setup
override func viewDidLoad() {
super.viewDidLoad()
addPreview()
}
/// Adds PDF preview to view hierarchy.
private func addPreview() {
addChild(previewController)
view.addSubview(previewController.view)
previewController.didMove(toParent: self)
// +Setup constraints or set previewController.view.frame = view.frame here
}
/// Sets share button.
private func setShareButton() {
let shareButton = UIBarButtonItem(
// It looks a little bit different to the original icon, apply scaling if needed.
image: UIImage(systemName: "square.and.arrow.up"),
primaryAction: .init(handler: { _ in
self.tappedShareButton()
}))
navigationItem.leftBarButtonItem = shareButton
}
/// Share button handler method.
private func tappedShareButton() {
let shareSheet = UIActivityViewController(activityItems: [fileURL], applicationActivities: nil)
present(shareSheet, animated: true)
shareSheet.popoverPresentationController?.barButtonItem = navigationItem.leftBarButtonItem
}
// MARK: - QLPreviewControllerDataSource
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
fileURL as QLPreviewItem
}
}