如何跳过工具栏单个Bar Button Item无障碍焦点,保留其他项焦点
解决IQToolbar无障碍跳过标题按钮且保持单个BarItem焦点的问题
先修正代码里的明显错误
你在添加Done按钮时写错了对象,把nextBarButton重复加入列表,这直接导致Done按钮没被正确纳入无障碍焦点,是核心问题之一:
if(inputAccessoryView.doneBarButton){ // 替换原错误代码,加入正确的Done按钮 [arrAccessibilityItems addObject:inputAccessoryView.doneBarButton]; }
跳过标题按钮的正确方式
要跳过标题按钮的无障碍焦点,直接不把它加入accessibilityElements数组即可,删掉标题按钮相关的添加逻辑:
// 移除这段标题按钮的添加代码 /* if(inputAccessoryView.titleBarButton){ IQTitleBarButtonItem *titleBtn= inputAccessoryView.titleBarButton; if(titleBtn.title.length>0){ [arrAccessibilityItems addObject:inputAccessoryView.titleBarButton]; } } */
确保单个BarItem获得独立焦点
设置accessibilityElements后,需要保证两个关键设置,避免Toolbar被当作整体朗读:
- 每个加入数组的BarButtonItem的
isAccessibilityElement设为YES(默认是YES,但自定义控件可能被修改,手动设置更保险) - 把Toolbar本身的
isAccessibilityElement设为NO,让系统只识别列表里的单个BarItem
修改后的完整beginEditingHandler方法:
- (void)beginEditingHandler:(NSNotification *)notification { UIResponder *responder = notification.object; IQToolbar *inputAccessoryView = (IQToolbar *)responder.inputAccessoryView; if (![inputAccessoryView isKindOfClass:[IQToolbar class]]) { return; } NSMutableArray *arrAccessibilityItems = [NSMutableArray array]; // 处理Previous按钮 if (inputAccessoryView.previousBarButton && !inputAccessoryView.previousBarButton.isHidden) { inputAccessoryView.previousBarButton.isAccessibilityElement = YES; [arrAccessibilityItems addObject:inputAccessoryView.previousBarButton]; } // 处理Next按钮 if (inputAccessoryView.nextBarButton && !inputAccessoryView.nextBarButton.isHidden) { inputAccessoryView.nextBarButton.isAccessibilityElement = YES; [arrAccessibilityItems addObject:inputAccessoryView.nextBarButton]; } // 处理Done按钮 if (inputAccessoryView.doneBarButton && !inputAccessoryView.doneBarButton.isHidden) { inputAccessoryView.doneBarButton.isAccessibilityElement = YES; [arrAccessibilityItems addObject:inputAccessoryView.doneBarButton]; } // 关键:不让Toolbar本身成为无障碍元素 inputAccessoryView.isAccessibilityElement = NO; // 设置自定义无障碍元素列表 inputAccessoryView.accessibilityElements = arrAccessibilityItems; // 额外:确保标题按钮完全被无障碍忽略 if (inputAccessoryView.titleBarButton) { inputAccessoryView.titleBarButton.isAccessibilityElement = NO; } }
测试注意
修改后关闭VoiceOver再重新打开,确保无障碍设置生效。
内容的提问来源于stack exchange,提问作者Shajo
相关产品推荐
相关产品推荐

