如何设置navigation controller返回按钮的alpha透明度值
问题根因
你采用的修改tintColor的方式失效,是因为UINavigationBar内部会对系统自带返回按钮的tintColor做自适应处理,当alpha值过低时会自动替换为系统默认的交互元素颜色,无法达到完全透明的效果。
修复方案
方案1:直接修改系统返回指示器透明度(兼容性高)
直接遍历导航栏子视图找到系统返回指示器控件,直接修改其alpha属性,无需替换按钮:
func scrollViewDidScroll(_ scrollView: UIScrollView) { let targetAlpha = // 你根据滚动偏移计算出的透明度值 guard let navBar = navigationController?.navigationBar else { return } for subview in navBar.subviews { if NSStringFromClass(type(of: subview)).contains("UINavigationBarBackIndicatorView") { subview.alpha = targetAlpha break } } }
适用场景:需要兼容iOS10及以上版本,不想修改原有返回按钮逻辑。
方案2:自定义返回按钮(稳定性最高)
完全替换系统自带返回按钮,自主控制透明度,不依赖系统私有视图:
override func viewDidLoad() { super.viewDidLoad() // 隐藏系统默认返回按钮 navigationItem.hidesBackButton = true // 自定义返回按钮 let customBackBtn = UIButton(type: .system) customBackBtn.setImage(UIImage(systemName: "chevron.backward"), for: .normal) customBackBtn.tintColor = .red customBackBtn.addTarget(self, action: #selector(popBack), for: .touchUpInside) navigationItem.leftBarButtonItem = UIBarButtonItem(customView: customBackBtn) } // 滚动时修改透明度 func scrollViewDidScroll(_ scrollView: UIScrollView) { let targetAlpha = // 计算得到的透明度值 navigationItem.leftBarButtonItem?.customView?.alpha = targetAlpha } @objc private func popBack() { navigationController?.popViewController(animated: true) }
适用场景:所有iOS版本,无需担心系统版本升级导致适配失效。
方案3:使用iOS13+导航栏外观API
针对iOS13及以上版本,用官方提供的外观API修改返回指示器样式:
func scrollViewDidScroll(_ scrollView: UIScrollView) { let targetAlpha = // 计算得到的透明度值 let appearance = UINavigationBarAppearance() appearance.configureWithDefaultBackground() // 自定义返回指示器图片,直接设置透明度 let backImage = UIImage(systemName: "chevron.backward")?.withTintColor(.red.withAlphaComponent(targetAlpha), renderingMode: .alwaysOriginal) appearance.setBackIndicatorImage(backImage, transitionMaskImage: backImage) // 同时更新两个状态的外观 navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance }
适用场景:最低支持iOS13的项目。
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

