Как получить UIAccessibilityNotifications в приложении для iPhone - PullRequest
5 голосов
/ 26 января 2010

Я заинтересован в том, чтобы программно фиксировать изменения пользовательского интерфейса в моем приложении, и подумал, что протокол UIAccessibility может помочь. Я нашел способ публикации UIAccessibilityLayoutChangedNotification и UIAccessibilityScreenChangedNotification, но я не уверен, как зарегистрироваться для получения этих уведомлений.

Я пытался использовать NSNotificationCenter, но параметр name ожидает string, в то время как два вышеупомянутых уведомления имеют тип UIAccesibilityNotifications, который является int.

Есть идеи, как зарегистрироваться для этих уведомлений?

Спасибо!

1 Ответ

5 голосов
/ 26 января 2010

Это отличный вопрос! К сожалению, вы не можете получать эти «уведомления», не влияя на нормальное поведение. (т.е. "нет, ты не можешь")


Если вы разберете UIKit, вы обнаружите, что UIAccessibilityPostNotification реализован так:

static void (*__UIAccessibilityBroadcastCallback)(UIAccessibilityNotifications notification, id argument);
void UIAccessibilityPostNotification(UIAccessibilityNotifications notification, id argument) {
    __UIAccessibilityBroadcastCallback (notification, argument);
}

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

Вы можете заменить функцию обратного вызова своей собственной, используя недокументированный API _UIAccessibilitySetBroadcastCallback:

void _UIAccessibilitySetBroadcastCallback(void (*replacement)(UIAccessibilityNotifications notification, id argument)) {
   __UIAccessibilityBroadcastCallback = replacement;
}

Однако, нет соответствующей функции get (даже частной), поэтому после ее установки исходные прослушиватели не могут быть снова уведомлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...