Я использую следующий код для обнаружения / прослушивания, когда iPad меняет ориентацию устройства.
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didRotate:)
name:@"UIDeviceOrientationDidChangeNotification"
object:nil];
Это вызывает мой метод didRotate: когда что-то меняется. В моем методе didRotate: я использую UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
, чтобы выяснить, какова ориентация, и соответственно применить мой код.
Однако в реальных тестах я заметил, что didRotate: вызывается каждую секунду, если iPad находится в руке человека. Похоже, что слушатель буквально прислушивается к каждому небольшому наклону и сдвигу в iPad, что, очевидно, часто происходит в руках человека (в отличие от плоского на столе).
Есть идеи, как я могу это исправить? Я мог бы изменить свой код, чтобы использовать ориентацию интерфейса, но у меня были проблемы с ним по любой причине. Спасибо.
* ОБНОВЛЕНИЕ : Этот слушатель создан в моем подклассе UIImageView. На экране их около десятка или больше. Я добавил [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
в мои методы удаления, когда я удаляю экземпляр. Это помогает объяснить, почему Rootate так часто появлялся (моя ошибка).
Тем не менее, я сузил сбои: всякий раз, когда я удаляю это экземпляр этого подкласса и поворачиваю свой iPad, я сбою. Иногда я получаю странные сообщения, такие как [__NSArrayM didRotate]: нераспознанный селектор (и другие странные объекты, такие как UIPanVelocity ... что-то). Мой слушатель все еще слушает после удаления экземпляра?
ИСПРАВЛЕНО : Спасибо за вашу помощь. Я наконец заметил, что было не так. Я удалял экземпляр, не удаляя наблюдателя и не заканчивая уведомления. Добавление следующего кода в методы удаления моего экземпляра решает мою проблему:
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] removeObserver:self];