Я интересуюсь получением изменений UI в моем приложении программно и думал что UIAccessibility
протокол может помочь. Я нашел, как отправить UIAccessibilityLayoutChangedNotification
и UIAccessibilityScreenChangedNotification
но я не уверен, как зарегистрироваться для получения этих уведомлений.
Я попытался использовать NSNotificationCenter
, но name
параметрический усилитель ожидает a string
, в то время как эти два уведомления выше имеют тип UIAccesibilityNotifications
который является int
.
Какая-либо идея, как зарегистрироваться для этих уведомлений?
Спасибо!
Отличный вопрос! К сожалению, вы не можете получать эти "уведомления", не влияя на нормальное поведение. (т.е. "нет, вы не можете")
Если вы разберете 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" (даже не приватной), поэтому, как только вы ее установите, оригинальные слушатели не смогут быть снова уведомлены.