我正在使我的iPhone应用程序可访问。 VoiceOver令人印象深刻。当用户使用VoiceOver时,它会自动读取屏幕上的项目,并允许用户双击屏幕上的任意位置以选择该项目。但是,我希望VoiceOver以特定的顺序读取项目,但是它总是以UINavigationBar项目(包括后退按钮)开头。我根本不想阅读这些项目,我只想从一个特定的项目开始。是否有VoiceOver等效的“firstResponder”?

最佳答案

是的

有一个称为UIAccessibilityContainer的协议(protocol),由NSObject实现。它使您可以使用以下三种方法来自定义容器行为:

  • accessibilityElementCount
  • accessibilityElementAtIndex:
  • indexOfAccessibilityElement:

  • 如果在主 View 中要控制可访问性元素的顺序,则只需实现这三种方法并返回合适的 View /索引。还有一件事是容器 View 本身不能是可访问性元素,因此您应该覆盖isAccessibilityElement:并返回NO
    - (BOOL)isAccessibilityElement {
        return NO;
    }
    

    示例实现

    我建议您按照希望它们出现的顺序排列所有 View ,或者如果不将其用于其他任何用途,请使用tag属性。该协议(protocol)的实现变得非常简单。

    元素数组

    我假设您有一个名为accessibleElements的数组,该数组以正确的顺序存储元素。
    - (NSInteger)accessibilityElementCount {
        return self.accessibleElements.count;
    }
    
    - (id)accessibilityElementAtIndex:(NSInteger)index {
        return self.accessibleElements[index];
    }
    
    - (NSInteger)indexOfAccessibilityElement:(id)element {
        return [self.accessibleElements indexOfObject:element];
    }
    

    标记元素

    我假设您的 subview 从0到 subview 的数量被连续标记。
    - (NSInteger)accessibilityElementCount {
        return self.subviews.count;
    }
    
    - (id)accessibilityElementAtIndex:(NSInteger)index {
        // Not that self should have a tag<0 or tag>count otherwise it will
        // return itself for that tag instead of the element you want it to.
        return [self viewWithTag:index];
    }
    
    - (NSInteger)indexOfAccessibilityElement:(id)element {
        return ((UIView *)element).tag;
    }
    

    关于iphone - 以编程方式确定VoiceOver读取UIView项的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6979065/

    10-13 09:26