Swift中如何自定义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
相关产品推荐
相关产品推荐

