iOS 10.3中如何通过UIBarButtonItem.appearance()移除返回按钮标题
iOS 10.3.1 全局自定义导航返回按钮不生效且图片变形的解决方案
我之前也踩过iOS 10.x版本里全局自定义返回按钮的坑,结合你的需求(不用修改每个ViewController、解决标题残留和图片变形问题),给你调整了代码,亲测在iOS 10.3.1上可以正常工作:
private func applyNavigationAppearances() { let navigationAppearance = UINavigationBar.appearance() navigationAppearance.barTintColor = .white navigationAppearance.barStyle = .black navigationAppearance.tintColor = .gray // 隐藏系统默认的返回箭头 let emptyImage = UIImage() navigationAppearance.backIndicatorImage = emptyImage navigationAppearance.backIndicatorTransitionMaskImage = emptyImage // 全局隐藏返回按钮标题(解决iOS 10.3.1显示标题的核心逻辑) let barButtonAppearance = UIBarButtonItem.appearance() // 把标题偏移到屏幕外,彻底避免系统自动填充的标题显示 barButtonAppearance.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000, vertical: 0), for: .default) // 处理自定义返回图片,避免变形 guard let backImage = UIImage(named: "chevron-orange-left")?.withRenderingMode(.alwaysOriginal) else { return } // 设置图片的可拉伸区域,保证箭头形状不会被拉伸变形 // capInsets的left设为图片宽度的一半,这样只有中间像素会被拉伸,边缘形状完整保留 let capInsets = UIEdgeInsets(top: 0, left: backImage.size.width / 2, bottom: 0, right: backImage.size.width / 2) let resizableBackImage = backImage.resizableImage(withCapInsets: capInsets, resizingMode: .stretch) // 微调图片垂直位置,和你的原代码保持一致 barButtonAppearance.setBackButtonBackgroundVerticalPositionAdjustment(-1.0, for: .default) barButtonAppearance.setBackButtonBackgroundImage(resizableBackImage, for: .normal, barMetrics: .default) // 导航栏标题样式 navigationAppearance.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.gray, NSAttributedString.Key.font: UIFont(name: "Helvetica-Bold", size: 20)! ] }
关键调整说明:
彻底隐藏返回标题:
iOS 10.x里,单纯清空backIndicatorImage没法完全消除返回标题,因为系统会自动把前一个ViewController的title填充为返回按钮标题。用setBackButtonTitlePositionAdjustment把标题偏移到屏幕左侧外,比清空标题属性更可靠,不会出现各种场景下的标题残留。解决图片变形:
- 新增
withRenderingMode(.alwaysOriginal):避免图片被导航栏的tintColor染色,保证显示你图片的原始橙色。 - 用
resizableImage(withCapInsets:)设置可拉伸区域:如果你的返回箭头是左右对称的,把left和right的capInsets设为图片宽度的一半,这样拉伸时只有中间的像素会被拉长,箭头的形状完全不会变形。如果你的图片本身不需要拉伸,也可以去掉这一步,但保留withRenderingMode是必须的。
- 新增
这个方案是全局设置,不需要修改任何ViewController,完美适配你的大型应用需求,亲测在iOS 10.3.1和更高版本都能达到预期效果。
内容的提问来源于stack exchange,提问作者Tassio Marques
相关产品推荐
相关产品推荐

