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 并覆盖 accessibilityIncrementaccessibilityDecrement。您无需重写 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

iOS 辅助功能 - 如何本地化 VoiceOver 语言

如何为 UIControls 组设置单个 VoiceOver

TableViewCell VoiceOver 辅助功能中的 UIButton