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

iOS15下QLPreviewController预览PDF时分享类BarButtonItems缺失问题

iOS15+ QLPreviewController预览PDF分享按钮异常问题修复方案

问题表现

  • 自iOS15版本起,QLPreviewController预览PDF文件时,右上角导航栏会新增搜索按钮、标注按钮两类BarButtonItems,iPhone端因顶部导航栏空间不足,原有的分享按钮无法正常展示。
  • 按照系统默认逻辑,顶部无法容纳的BarButtonItems应当在底部额外的导航栏中展示,但实际开发中会出现底部导航栏默认完全不显示的问题。仅当先点击预览区域中部(此时除文档外所有导航元素都会隐藏),再次点击中部区域后,底部导航栏才会正常出现,包含功能完全正常的分享按钮。

问题截图:
问题截图

修复方案

方案1:主动设置底部工具栏默认显示

通过公开API强制底部工具栏默认显示,符合系统原生交互逻辑,无需修改原有按钮结构,推荐优先使用:

// Swift 实现
let previewVC = QLPreviewController()
previewVC.dataSource = self
// 初始化时设置底部栏不隐藏
previewVC.setToolbarHidden(false, animated: false)

// 若嵌套在UINavigationController中使用,可在生命周期中补充设置避免被系统重置
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setToolbarHidden(false, animated: false)
}
// Objective-C 实现
QLPreviewController *previewVC = [[QLPreviewController alloc] init];
previewVC.dataSource = self;
[previewVC setToolbarHidden:NO animated:NO];

方案2:调整顶部按钮优先级

将分享按钮调整到顶部导航栏最左侧优先显示位置,避免被新增的搜索、标注按钮挤掉:

// 需在QLPreviewController加载完成后调用
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    guard let nav = previewVC.navigationController,
          let topItem = nav.topViewController?.navigationItem,
          let rightItems = topItem.rightBarButtonItems,
          rightItems.count >= 3 else { return }
    // 系统默认顺序为:标注、搜索、分享,调整为分享、标注、搜索
    var adjustedItems = rightItems
    let shareItem = adjustedItems.remove(at: 2)
    adjustedItems.insert(shareItem, at: 0)
    topItem.rightBarButtonItems = adjustedItems
}

方案3:隐藏使用率低的系统按钮

如果你的业务场景不需要搜索/标注功能,可以直接隐藏对应按钮,为分享按钮留出顶部空间:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    guard let nav = previewVC.navigationController,
          let topItem = nav.topViewController?.navigationItem else { return }
    // 仅保留分享按钮,根据业务需求调整保留逻辑
    topItem.rightBarButtonItems = topItem.rightBarButtonItems?.filter({ item in
        // 可通过item的action、image等属性识别需要保留的按钮
        item.action == NSSelectorFromString("shareAction:")
    })
}

注意事项

  • 以上方案均使用系统公开API实现,无审核风险。
  • 建议添加系统版本判断,仅在iOS15及以上版本执行适配逻辑,避免低版本系统出现兼容问题。
  • 不要修改QLPreviewController的私有视图属性,避免系统版本迭代后功能失效。

内容的提问来源于stack exchange,提问作者Bob de Graaf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:06:03