UIPageControl和VoiceOver /辅助功能

Dan*_*nor 8 accessibility uipagecontrol ios

当在跳板上使用语音转换时,当选择屏幕底部的UIPageControl时,VoiceOver会宣布类似"第1页,共5页可调整"的内容.并且用户可以向上和向下滑动以更改页面.

在我的应用程序中,我没有得到"可调整"部分,并且无法通过滑动更改页面.

我有什么想法解决这个问题?它显然会破坏应用程序的可用性.

mic*_*cap 8

我已经将子类化UIPageControl并覆盖了-accessibilityTraitsgetter,以便UIAccessibilityTraitAdjustable将Voice Over 返回到"可调"状态.

要添加操作:实现类别中指定的-accessibilityIncrement-accessibilityDecrement方法UIAccessibilityAction.

由于我的页面会响应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
Run Code Online (Sandbox Code Playgroud)


Jor*_*n H 5

如果您支持 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在您的视图控制器中,您可以监听 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)
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不子类化UIPageControl此目标/操作仍将被调用,但当前页面点指示器不会更新。