UIPageControl 和 VoiceOver/辅助功能
Posted
技术标签:
【中文标题】UIPageControl 和 VoiceOver/辅助功能【英文标题】:UIPageControl and VoiceOver/accessibility 【发布时间】:2012-04-01 21:26:35 【问题描述】:在跳板上使用跳过的声音时,选择屏幕底部的UIPAGEControl时,Doicalofer会宣布一些类似的东西“第1页。”并且用户可以上下滑动切换页面。
在我的应用程序中,我没有得到“可调整”部分,并且无法通过滑动来更改页面。
任何想法我如何解决这个问题?这显然会扼杀应用程序的可用性。
【问题讨论】:
您是在 InterfaceBuilder 中执行此操作还是以编程方式执行此操作?听起来它缺少UIAccessibilityTraitAdjustible 的特性——您是直接使用页面控件还是在另一个知道如何管理它的视图中使用?) 【参考方案1】:我继承了 UIPageControl
并覆盖了 -accessibilityTraits
getter 以返回 UIAccessibilityTraitAdjustable
让 Voice Over 读取“可调整”。
要添加操作:实现UIAccessibilityAction
类别中指定的-accessibilityIncrement
和-accessibilityDecrement
方法。
由于我的页面会响应 UIControlEventValueChanged
事件,因此我确保也为此事件发送操作。
示例代码
@interface AccessibleUIPageControl : UIPageControl
@end
@implementation AccessibleUIPageControl
- (UIAccessibilityTraits)accessibilityTraits
return super.accessibilityTraits | UIAccessibilityTraitAdjustable;
- (void)accessibilityIncrement
self.currentPage = self.currentPage + 1;
[self sendActionsForControlEvents:UIControlEventValueChanged];
- (void)accessibilityDecrement
self.currentPage = self.currentPage - 1;
[self sendActionsForControlEvents:UIControlEventValueChanged];
@end
【讨论】:
通常,combine the traits 来自super
,具有所需的特征,例如 return super.accessibilityTraits | UIAccessibilityTraitAdjustable
。【参考方案2】:
如果您支持 iOS 9 及更高版本,此行为现在已成为标准 - 无需特殊处理。
如果您支持 ios 8 及更低版本,请继承 UIPageControl
并覆盖 accessibilityIncrement
和 accessibilityDecrement
。您无需重写 accessibilityTraits
属性以表明它是可调整的 - 默认情况下 UIPageControl
是可调整的。
import UIKit
class AccessibleUIPageControl: UIPageControl
override func accessibilityIncrement()
self.currentPage += 1
self.sendActionsForControlEvents(.ValueChanged)
override func accessibilityDecrement()
self.currentPage -= 1
self.sendActionsForControlEvents(.ValueChanged)
然后在您的视图控制器中,您可以侦听 ValueChanged 并做出适当的响应以显示新页面的内容:
//viewDidLoad:
self.pageControl.addTarget(self, action: "didChangePage", forControlEvents: .ValueChanged)
func didChangePage()
let contentOffset: CGFloat = collectionView.frame.size.width * CGFloat(pageControl.currentPage)
collectionView.setContentOffset(CGPointMake(contentOffset, 0), animated: false)
请注意,如果您不继承 UIPageControl
,此目标/操作仍将被调用,但当前页面点指示器不会更新。
【讨论】:
嗨,我在使用页面控件时遇到的问题是,当焦点位于计数器上时,我无法让它增加或减少计数器。我的目标平台是 iOS 10 及更高版本。有什么办法可以帮助我吗?谢谢! @KarthikKannan 抱歉,我自己没有看到这个问题【参考方案3】:我仍然需要使用 iOS 10+ 实现自定义 AccessiblePageControl(如上所述)。我遵循上述方法,但在我的故事板上为 touchUpInside 和 valueChanged 链接了一个 IBAction。
【讨论】:
以上是关于UIPageControl 和 VoiceOver/辅助功能的主要内容,如果未能解决你的问题,请参考以下文章
VoiceOver 是不是总是忽略宽度和高度为零的 iOS 视图?
VoiceOver中isAccessibilityElement和accessibilityElementsHidden的区别
如何为 tableview 上的 webview 内容启用 VoiceOver