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
相关产品推荐
相关产品推荐

