如何为无标题UITabBarItem自定义UIAccessibility以播报选中项名称?
嘿,这个问题我之前做项目的时候也踩过坑,给你分享两个靠谱的解决思路,应该能完美匹配你的需求:
方法1:隐藏title的视觉显示,但保留title值
其实你不用把UITabBarItem.title设为空,只要让它在视觉上消失就行——这样系统辅助功能会自动用title作为播报名称,同时保留默认的「位置+总标签数」播报,完全符合你的要求:
// 初始化时给tabBarItem设置你需要播报的名称(比如"Home") let homeTabItem = UITabBarItem(title: "Home", image: UIImage(named: "home"), selectedImage: UIImage(named: "home_selected")) // 通过设置字体大小为0,让title在视觉上不可见 homeTabItem.setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 0)], for: .normal) homeTabItem.setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 0)], for: .selected) // 要是觉得字体大小为0不够稳妥,也可以把title偏移到屏幕外 // homeTabItem.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: 100)
这样设置后,用户视觉上看不到title,但辅助功能会正常播报「Home,第X个,共Y个」,完美兼顾视觉和无障碍需求。
方法2:强制自定义accessibilityLabel(适合必须把title设为空的场景)
如果你因为某些原因必须把title设为空,可以通过自定义子类或者直接设置accessibilityLabel来强制覆盖系统逻辑,注意别碰accessibilityValue和accessibilityHint,不然会干扰系统的位置播报:
方式A:自定义UITabBarItem子类
class AccessibleTabBarItem: UITabBarItem { // 重写accessibilityLabel,返回你需要的播报名称 override var accessibilityLabel: String? { get { // 这里可以根据item的tag或者索引返回对应名称,比如tag=0返回"Home" switch tag { case 0: return "Home" case 1: return "Profile" default: return super.accessibilityLabel } } set {} } } // 使用这个子类创建tabBarItem let homeTabItem = AccessibleTabBarItem(image: UIImage(named: "home"), selectedImage: UIImage(named: "home_selected")) homeTabItem.tag = 0
方式B:直接遍历设置accessibilityLabel
在你的UITabBarController的viewDidLoad里,直接给每个tabBarItem赋值:
override func viewDidLoad() { super.viewDidLoad() guard let tabBarItems = tabBar.items else { return } // 给每个item设置自定义的播报名称 tabBarItems[0].accessibilityLabel = "Home" tabBarItems[1].accessibilityLabel = "Profile" // ...其他标签栏项的设置 }
为什么之前你的设置没生效?
当UITabBarItem.title为空时,系统的无障碍逻辑会优先使用内部的占位逻辑,而忽略你设置的accessibilityLabel——要么保留title但隐藏它,要么强制覆盖accessibilityLabel,就能解决这个问题。
内容的提问来源于stack exchange,提问作者MrChrisBarker
相关产品推荐
相关产品推荐

