Какое представление следует использовать для UIAccessibilityConvertFrameToScreenCoordinates?

Может ли кто-нибудь четко объяснить UIView, что UIAccessibilityConvertFrameToScreenCoordinates ожидает своего второго аргумента? Иногда он ведет себя так, как я ожидал, рисуя прямоугольник фокуса VoiceOver над соответствующим элементом, но в других случаях использование этой вспомогательной функции кажется просто вуду!

В документации Apple, похоже, нет объяснения. В нем указано, что аргументом должно быть представление, содержащее CGRect, но в некоторых реализациях неясно, какое представление является текущим контекстом CG. Есть ли простой способ решить эту проблему?

В качестве примера я создаю настраиваемый UITableViewCell, который имеет настраиваемый порядок фокусировки VoiceOver, переопределяя реализацию UIAccessibilityContainer ячейки (см. Ниже). 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];
}

Надеюсь, это кому-то понятно. Заранее спасибо.


person Jon Gibbins    schedule 23.06.2015    source источник


Ответы (2)


Давайте посмотрим на назначение этой функции из документации:

Converts the specified rectangle from view coordinates to screen coordinates.

Итак, вы передаете этой функции прямоугольник представления в его родительском представлении, а затем само родительское представление. Учитывая эту информацию, вы получаете вывод, который представляет собой экранные координаты представления. Итак, ответ - собственное представление прямоугольника, из которого вы рассчитали относительный прямоугольник. Обычно это иерархически непосредственное родительское представление, но потенциально может быть выше по иерархии представлений.

Если, например, ваш прямоугольник был {0, 0, view.width, view.height}, и вы передали представление этому аргументу, на выходе будет тот же прямоугольник, который вы передали, с начальными x и y. координаты скорректированы с учетом его положения на экране.

person ChrisCM    schedule 23.06.2015

Разобрался и забыл опубликовать. Ключ к этому, по-видимому, заключается в переопределении метода accessibilityFrame представления, поскольку VoiceOver, вероятно, потребуется опросить представление для информации о кадре. Таким образом, вы не можете просто установить accessibilityFrame один раз, как если бы это свойство представления.

person Jon Gibbins    schedule 29.03.2016
comment
Возвращаясь к этому после нескольких тестов, кажется, я был прав. Свойства доступности обычно статические - свойства кнопок, статический текст / свойства accessibilityLabel и т. Д. Поскольку видимая рамка доступности для компонента с большей вероятностью изменится, чем другие свойства доступности - подумайте об изменении ориентации, изменении макета и т. в представлении для ожидаемого поведения, поскольку это метод, который VoiceOver будет вызывать для получения соответствующих экранных координат для рисования его рамки доступности. - person Jon Gibbins; 15.11.2016