如何防止在 Xamarin.Forms iOS 中打开 QLPreviewController 的标题菜单?

问题描述 投票:0回答:1

我使用 QLPreviewController 打开一个文件,以在 Xamarin.Forms iOS 应用程序中预览它。 我关闭了“打开方式”按钮,以防止将文件导出到 QLPreviewController 中的应用程序。但是,在我的测试设备 (iPad) 上进行最新的 iOS 更新后,我看到当按下导航栏中的标题时,会打开一个菜单,并显示“打开方式”选项。

如何关闭它?

xamarin xamarin.forms xamarin.ios uinavigationbar qlpreviewcontroller
1个回答
0
投票

对我来说唯一没有太多黑客攻击的解决方案是将

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
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.