首页 文章

以编程方式确定VoiceOver应读取UIView项的顺序

提问于
浏览
9

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

2 回答

  • 0

    是的

    有一个名为 UIAccessibilityContainer 的协议,由NSObject实现 . 它使您可以使用以下三种方法自定义容器行为:

    • accessibilityElementCount

    • accessibilityElementAtIndex:

    • indexOfAccessibilityElement:

    如果您有一个主视图,您想要控制辅助功能元素的顺序,您只需实现这三个方法并返回合适的视图/索引 . 还有一件事是容器视图本身不能成为可访问性元素,因此您应该覆盖 isAccessibilityElement: 并返回 NO ;

    - (BOOL)isAccessibilityElement {
        return NO;
    }
    

    示例实现

    我建议您按照希望它们出现的顺序拥有所有视图的数组,或者如果不将其用于其他任何内容,则使用 tag 属性 . 协议的实现变得非常简单 .

    元素数组

    我假设你有一个名为 accessibleElements 的数组,它以正确的顺序存储元素 .

    - (NSInteger)accessibilityElementCount {
        return self.accessibleElements.count;
    }
    
    - (id)accessibilityElementAtIndex:(NSInteger)index {
        return self.accessibleElements[index]; 
    }
    
    - (NSInteger)indexOfAccessibilityElement:(id)element {
        return [self.accessibleElements indexOfObject:element];
    }
    

    标记元素

    我假设您的子视图从0到子视图的数量不断标记 .

    - (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;
    }
    
  • 6

    在某些情况下,在一个项目上设置UIAccessibilityTraitSummaryElement可以执行此操作 . (我的游戏似乎过于动态,无法提供帮助 . )

相关问题