您应该将哪个视图用于UIAccessibilityConvertFrameToScreenCoordinates?

时间:2015-06-23 16:41:06

标签: ios accessibility voiceover uiaccessibility

任何人都可以清楚地解释UIAccessibilityConvertFrameToScreenCoordinates期望其第二个论点的UIView吗?有时它表现得像我期望的那样,将VoiceOver的焦点矩形绘制在适当的元素上,但是其他时候使用这个辅助函数看起来就像伏都教!

Apple的文档似乎没有解释。它声明参数必须是包含CGRect的视图,但在某些实现中,它不清楚哪个视图是CG的当前上下文。有没有一种简单的方法可以解决这个问题?

例如,我通过覆盖单元格的UIAccessibilityContainer实现(见下文)创建了一个自定义的UITableViewCell,它具有自定义的VoiceOver焦点顺序。无论我尝试什么,accessibilityFrame都是关闭的。我尝试发送对相关UITableView的引用,包含该接口的父UIView以及窗口本身。我觉得我已经浏览了整个视图堆栈!

以下不是自定义UITableViewCell类的完整代码,但应该让您了解我尝试做的事情。

#pragma mark - Accessibility (UIAccessibilityContainer implementation)

- (id)accessibilityElementAtIndex:(NSInteger)index
{
    return [self.accessibilityObjects objectAtIndex:index];
}

- (NSInteger)accessibilityElementCount
{
    return self.accessibilityObjects.count;
}

- (NSInteger)indexOfAccessibilityElement:(id)element
{
    return [self.accessibilityObjects indexOfObject:element];
}

- (void *)addAccessibilityElement:(UIView *)accessibleView{
    if (self.accessibilityObjects == nil) {
        self.accessibilityObjects = [NSMutableArray array];
    }

    UIAccessibilityElement *accessibilityElement = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
    accessibilityElement.accessibilityLabel = accessibleView.accessibilityLabel;
    //accessibilityElement.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(accessibleView.frame, self.contentView);
    //accessibilityElement.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(accessibleView.frame, self.parentView); // parentView is a reference to the view controller's parent view
    accessibilityElement.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(accessibleView.frame, self.tableView); // tableView is a reference to the cell's UITableView

    [self.accessibilityObjects addObject:accessibilityElement];
}

我希望这对某人有意义。提前谢谢。

2 个答案:

答案 0 :(得分:3)

让我们从文档中了解此功能的用途:

Converts the specified rectangle from view coordinates to screen coordinates.

因此,您正在将此函数传递给视图的矩形,在其父视图中,然后是父视图本身。根据此信息,您将获得一个输出,即视图的屏幕坐标。所以,答案是,矩形的拥有视图,您从中计算相对矩形。这通常是它的分层直接父视图,但可能在视图层次结构中更高。

例如,如果您的矩形是{0,0,view.width,view.height},并且您将视图传递给此参数,则输出将是您传入的相同Rectangle,其初始值为调整x和y坐标在屏幕上的位置。

答案 1 :(得分:1)

想出来,忘了发帖。对此的关键似乎在于覆盖视图的accessibilityFrame方法,因为VoiceOver可能需要轮询视图以获取帧信息。因此,您不能只设置一次accessibilityFrame,就像它是视图的属性一样。