6

启用 VoiceOver 后,用户可以使用 3 指滑动手势来滚动 TableView。VoiceOver 向用户口头宣布一个短语,指示他们在 tableview 上的位置,即可见的行,例如“第 1 到 4 行,共 5​​ 行”。

我想覆盖这个口头提示并让画外音向用户宣布其他内容。

4

2 回答 2

23

使用UIScrollViewAccessibilityDelegate并实现方法-accessibilityScrollStatusForScrollView:

例子

- (NSString *)accessibilityScrollStatusForScrollView:(UIScrollView *)scrollView
{
    return @"Your text";
}
于 2013-08-29T13:41:05.727 回答
11

您不能更改消息。您将不得不覆盖accessibilityScroll:并进行滚动,然后发布滚动公告(至少我不知道任何其他方式)。不过也不是特别难。

该怎么办

由于您有一个表格视图,您可以使用 滚动到某一行scrollToRowAtIndexPath:atScrollPosition:animated:。您可以决定一个可访问性元素是 X 行数。在这种情况下,您可以从表格视图中获取一组可见行,并将 X 添加或删除到最后一个或第一个单元格的行(取决于滚动是向上还是向下)。

最后要宣布表格视图确实滚动了,您应该发布“页面滚动”通知并传递要阅读的文本。最后你应该返回YES说你处理了滚动(如果你不这样做,那么事件将继续传播)。

示例实现

一个基本的实现可能看起来像这样(我做出了一些可能会根据您的代码而改变的假设,就像只有一个部分一样):

- (BOOL)accessibilityScroll:(UIAccessibilityScrollDirection)direction 
{
    BOOL isScrollingUp = NO;
    switch (direction) {
        case UIAccessibilityScrollDirectionUp: {
            isScrollingUp = YES;
        } break;

        case UIAccessibilityScrollDirectionDown: {
            isScrollingUp = NO;
        } break;

        default:
            // These cases are not handled
            return NO;
    }

    NSInteger numberOfCellsToScroll = 5; // Any number you'd like

    NSInteger newRow = -1;
    if (isScrollingUp) {
        newRow = [self.tableView indexPathsForVisibleRows][0].row - numberOfCellsToScroll;
    } else {
        newRow = [[self.tableView indexPathsForVisibleRows] lastObject].row + numberOfCellsToScroll;
    }

    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:newRow inSection:0] 
                          atScrollPosition:UITableViewScrollPositionMiddle 
                                  animated:YES];

    UIAccessibilityPostNotification(UIAccessibilityPageScrolledNotification,
                                    @"YOUR CUSTOM TEXT FOR THE SCROLL HERE");

    return YES; // We handled the scroll
}
于 2013-03-25T13:27:41.577 回答