You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS16中QuickLook导航栏标题菜单隐藏方法问询

iOS16下QuickLook隐藏标题区域箭头菜单的解决方案

针对iOS16中QLPreviewController标题区域新增的箭头菜单(含分享、保存等选项),以下是几种可行的隐藏方案:

方案1:自定义QLPreviewController子类拦截导航栏元素

QLPreviewController内部会在生命周期中重置导航栏元素,直接设置titleMenuProvider = nil无法持久生效,需在子类中多次覆盖设置:

class CustomQLPreviewController: QLPreviewController {
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        navigationItem.rightBarButtonItems = []
        navigationItem.titleMenuProvider = nil
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 二次确认,避免QL内部刷新时重新添加菜单
        navigationItem.rightBarButtonItems = []
        navigationItem.titleMenuProvider = nil
    }
}

使用时直接初始化这个子类即可。

方案2:遍历导航栏子视图隐藏菜单按钮

若方案1无效,可通过遍历UINavigationBar的私有子视图找到菜单按钮并隐藏(适配iOS16):

extension QLPreviewController {
    func hideTitleMenu() {
        guard let navBar = navigationController?.navigationBar else { return }
        for subview in navBar.subviews {
            // 匹配iOS16标题菜单的私有类名
            if String(describing: type(of: subview)) == "UIMenuButton" {
                subview.isHidden = true
                break
            }
        }
    }
}

在QLPreviewController的viewDidAppear中调用该方法:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    hideTitleMenu()
}

方案3:结合代理拦截操作(可选)

如果需要彻底禁止分享、保存功能,可配合实现QLPreviewControllerDelegate:

func previewController(_ controller: QLPreviewController, shouldOpenURL url: URL, for item: QLPreviewItem) -> Bool {
    // 拦截所有跳转类操作
    return false
}

注意事项

  • 遍历私有视图的方法依赖系统内部实现,后续iOS版本可能失效,建议配合if #available(iOS 16.0, *)做版本判断。
  • 确保QLPreviewController使用的是系统导航栏,若自定义导航栏需调整视图查找范围。

内容的提问来源于stack exchange,提问作者Basel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:12:42