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

Swift中如何自定义NavigationBar返回按钮并保留侧滑返回功能?

解决自定义NavigationBar返回按钮时默认图标残留且保留侧滑返回的问题

问题原因

你当前使用的navigationItem.backBarButtonItem属性,作用是设置当前页面被push后,下一个页面的返回按钮样式,而非修改当前页面自身的返回按钮。这就是自定义图标会和默认返回图标叠加显示的核心原因。

解决方案

方案一:单个页面自定义(保留侧滑返回)

直接隐藏默认返回按钮,自定义左侧按钮并绑定返回逻辑,同时确保侧滑手势正常工作:

public override func viewDidLoad() {
    super.viewDidLoad()
    
    // 隐藏默认返回按钮
    navigationItem.hidesBackButton = true
    
    // 创建自定义返回按钮
    let backBtn = UIBarButtonItem(image: UIImage(named: "back_icon"), style: .plain, target: self, action: #selector(popCurrentVC))
    navigationItem.leftBarButtonItem = backBtn
    
    // 修复侧滑返回手势失效问题(可选,若手势正常可省略)
    navigationController?.interactivePopGestureRecognizer?.delegate = self
}

// 返回按钮点击事件
@objc private func popCurrentVC() {
    navigationController?.popViewController(animated: true)
}

// 手势代理扩展(若添加了上面的手势设置则需要)
extension YourViewController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        // 确保只有存在上一级页面时才启用手势
        return (navigationController?.viewControllers.count ?? 0) > 1
    }
}

方案二:全局统一自定义(推荐)

如果所有页面都需要统一的返回按钮样式,直接全局配置导航栏,无需每个页面单独设置,且自动保留侧滑返回:

// 在AppDelegate或SceneDelegate的初始化方法中添加
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 替换默认返回图标
    UINavigationBar.appearance().backIndicatorImage = UIImage(named: "back_icon")
    UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(named: "back_icon")
    
    // 移除返回按钮的文字(可选)
    UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000, vertical: 0), for: .default)
    
    return true
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:51:29