Приложение для iOS не обнаруживает изменение ориентации устройства

У меня проблема с изменением ориентации в моем приложении. Мое приложение поддерживает ориентацию устройства Portrait, LandscapeLeft и LandscapeRight, и я на 100% уверен, что правильно настроил его в Info.plist. Когда я запускаю свое приложение на своем iPhone / симуляторе и поворачиваю устройство, ни одно из моих приложений ViewController не реагирует на вращение. То есть ни один ViewControllers не может быть переведен в ландшафтный режим независимо от того, насколько сильно и безумно я поворачиваю свой телефон. Я попытался переопределить переменную «Автоповорот», чтобы вернуть истину / ложь, тот же результат, Мое приложение придерживается одного портретного режима, чего я не хочу. Итак, я подумал, что, может быть, мое приложение даже не может обнаружить изменение ориентации устройства; поэтому я поместил следующий код в свой AppDelegate, и я был прав, функция «deviceOrientationDidChange» никогда не вызывается, когда я поворачиваю свой телефон, но она вызывается, когда приложение входит в фоновый режим. У кого-нибудь есть подсказки? Я боролся с этим в течение нескольких дней и пытался найти решение в Интернете, но без надежды. Пожалуйста помоги.

UIDevice.current.beginGeneratingDeviceOrientationNotifications()
let notifiCenter = NotificationCenter.default
notifiCenter.addObserver(self, selector: #selector(self.deviceOrientationDidChange(_:)), name: .UIDeviceOrientationDidChange, object: nil)

func deviceOrientationDidChange(_ notification: Notification) {
    print("device orientation did change...")
}

person Markus Wu    schedule 19.04.2017    source источник
comment
Является ли ваш «корневой» контроллер представления NavController? TabBarController? Контроллер единого представления? Вы делаете что-нибудь еще в AppDelegate, например, настраиваете свойства строки состояния? Вы используете раскадровку? Если да, то если вы (временно) добавите новую раскадровку и новый простой UIViewController, будет ли этот правильно вращаться?   -  person DonMag    schedule 19.04.2017
comment
Мое приложение обеспечивает аутентификацию. Когда пользователи проходят аутентификацию, rootViewController - это TabBarController. В противном случае rootViewController - это UIPageViewController. Да, я использую Storyboard, и большая часть моего VC подключена к Main Storyboard. У меня есть эта строка в моем AppDelegate: application.statusBarOrientation = .portrait, чтобы заставить приложение запускаться в портретном режиме. Я попытался удалить эту строку, viewControllers по-прежнему ведут себя так же.   -  person Markus Wu    schedule 19.04.2017
comment
хммм ... заставляет меня задуматься, есть ли где-нибудь в вашем коде еще один (или несколько) экземпляров application.statusBarOrientation = .portrait. Если вы удалите эту строку из AppDelegate и запустите приложение на iPad уже в альбомной ориентации, будет ли оно по-прежнему запускаться в портретной ориентации?   -  person DonMag    schedule 19.04.2017
comment
Я выполнил поиск по ключевому слову statusBarOrientation, это единственное место, где оно есть. Я действительно попробовал программно изменить ориентацию устройства, и это сработало. ViewControllers перешли в ландшафтный режим.   -  person Markus Wu    schedule 19.04.2017
comment
Мне кажется, проблема заключается в том, что мое приложение игнорирует изменение ориентации устройства или просто не получает уведомления. Я поместил код из этого вопроса в свое приложение. Очень странно, что функция наблюдателя никогда не вызывается, когда я поворачиваю свой телефон. Но он вызывается, когда приложение didEnterBackground или willEnterForeground. Мне очень странно.   -  person Markus Wu    schedule 19.04.2017
comment
Попробуйте и посмотрите, какие сообщения вы получите (слишком много кода для комментария, но это не ответ ...): gist.github.com/DonMag/1f0ebbd0824337a1408fb265c9e16c48   -  person DonMag    schedule 19.04.2017
comment
Он напечатал список уведомлений, как и ожидалось, и UIDeviceOrientationDidChangeNotification является одним из них. Но когда я повернул телефон, showNotifs (_ :) не вызывается. Как я упоминал ранее, уведомление directionDidChange отправляется, когда приложение входит в forgeground или background, но не когда я поворачиваю свой iphone.   -  person Markus Wu    schedule 19.04.2017
comment
Да, очень странно ... вы используете какую-то стороннюю библиотеку, которая как-то нехорошо влияет на ваше приложение? Вы пытались временно изменить стартовую раскадровку и контроллер представления, как я предлагал ранее?   -  person DonMag    schedule 19.04.2017
comment
Ага, у меня было установлено много сторонних фреймворков. Это первое, что пришло мне в голову, сторонняя структура может расширять классы, которые изменяют обычное поведение классов. Мне нужна помощь, чтобы узнать, что может изменить поведение уведомления DeviceOrientationChange, поэтому я могу вернуться в свое приложение и посмотреть, есть ли коды, которые меняют это поведение. Прямо сейчас я даже не знаю, как определить, вызывают ли какие-либо фреймворки некорректное поведение. Я поигрался с соответствующими var 'Autorotate', 'primaryInterfaceOrientationForPresentation' и 'supportedInterfaceOrientations'.   -  person Markus Wu    schedule 19.04.2017
comment
Ладно ... извините, но я не знаю, как предложить дополнительную помощь. Я полагаю, что моим последним предложением было бы начать новый проект, добавлять сторонние фреймворки по одному, пока вы не столкнетесь с той же проблемой с вашим новым проектом. Тогда ты узнаешь.   -  person DonMag    schedule 19.04.2017
comment
да. Большое спасибо за ваше время и помощь. Действительно ценю это. :)   -  person Markus Wu    schedule 19.04.2017


Ответы (2)


Я не знаю, чего вы пытаетесь достичь, но обычно использую:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) // Do more stuff }

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

person Eric García    schedule 19.04.2017
comment
Спасибо за ваш ответ. Я пробовал это. Проблема, с которой я столкнулся прямо сейчас, заключается в том, что никакие ViewControllers не могут даже обнаружить изменение ориентации, viewWillTransition также никогда не вызывается. - person Markus Wu; 19.04.2017
comment
Попробуйте использовать эту функцию в своем контроллере просмотра и установите точку останова, чтобы проверить, работает ли при изменении поворота. - person Eric García; 19.04.2017
comment
да. Я пробовал это. Если вы посмотрите на мой код из этого вопроса. Похоже, проблема заключается в том, что ViewControllers даже НЕ уведомляются об изменении ориентации устройства. Чтобы уточнить, смена ориентации отлично работает для других приложений, запущенных на моем телефоне, а блокировка портретной ориентации отключена на моем iPhone. - person Markus Wu; 19.04.2017

Я все еще не мог понять, в чем на самом деле причины, но эта проблема была исправлена ​​после того, как я обновил все платформы модулей, используемые в моем приложении. Я очень старался выяснить, что вызывает эту проблему. К сожалению, не смог. У меня через pod установлено около 20 сторонних фреймворков. Мое решение этой проблемы - Pod Update. Не повезло с причинами. Надеюсь, этот ответ поможет кому-то в будущем.

person Markus Wu    schedule 19.06.2017