2015-06-23 5 views
1

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

Документация от 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]; 
} 

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

ответ

2

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

Converts the specified rectangle from view coordinates to screen coordinates. 

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

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

+0

Спасибо, Крис. Я буду использовать его, используя эту информацию. – dotjay

0

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

+0

Возвращаясь к этому после нескольких тестов, кажется, я был прав. Свойства доступности - это, как правило, свойства статической кнопки, свойства статического текста/доступности и свойства. Так как видимый кадр доступности для компонента с большей вероятностью изменится, чем другие свойства доступности - измените ориентацию ориентации, изменения макета и т. Д. - вы должны переопределить accessibilityFrame метод в представлении ожидаемого поведения, так как это метод, который VoiceOver будет вызывать для получения соответствующих экранных координат для создания рамки его доступности. – dotjay