Я использую Swift и хочу иметь возможность загружать UIViewController при повороте на альбомную ориентацию. Может ли кто-нибудь указать мне правильное направление?
Я ничего не могу найти в Интернете и немного смущен документацией.
ios
swift
orientation-changes
Дэвид
источник
источник
Ответы:
Вот как я получил это работает:
В
AppDelegate.swift
внутриdidFinishLaunchingWithOptions
функции я ставлю:а затем внутри класса AppDelegate я поместил следующую функцию:
Надеюсь, это поможет кому-нибудь еще!
Спасибо!
источник
selector
иметь формат строки"rotated:"
??rotated()
это не так)UIDeviceOrientation
это что-то отличное отUIInterfaceOrientation
... Это потому, чтоUIDeviceOrientation
также обнаруживает ориентацию лицевой стороной вниз и лицевой стороной вверх, что означает, что ваш код может случайным образом перемещаться между книжной и альбомной ориентацией, если ваше устройство лежит на почти плоской, но слегка неровной поверхности (т.е. покачивание на выступающей поверхности). камераисточник
Необходимо обнаружить вращение при использовании камеры с
AVFoundation
, и обнаружил, чтоdidRotate
(в настоящее время не рекомендуется ) &willTransition
методы были ненадежными для моих нужд. Использование уведомления, опубликованного Дэвидом, сработало, но не актуально для Swift 3.x / 4.x.Swift 4.2 Имя уведомления было изменено.
Значение закрытия остается таким же, как Swift 4.0:
Чтобы настроить уведомление для Swift 4.2 :
Чтобы снять уведомление для Swift 4.2 :
Что касается заявления об устаревании , мой первоначальный комментарий вводил в заблуждение, поэтому я хотел обновить его. Как уже отмечалось, использование
@objc
вывода не рекомендуется, что, в свою очередь, было необходимо для использования#selector
. Вместо этого можно избежать замыкания, и теперь у вас есть решение, позволяющее избежать сбоя из-за вызова неверного селектора.Все ниже здесь устарело с XCode 10 и iOS 4.2
Swift 4.0 В Swift 4.0 Apple рекомендовала нам избегать использования
#selector
, поэтому в этом подходе теперь используется блок завершения. Этот подход также обратно совместим со Swift 3.x и будет рекомендованным подходом в будущем.Это предупреждение компилятора, которое вы получите в проекте Swift 4.x, если вы используете
#selector
функцию из-за устаревания@objc
вывода:Вступление в стремительную эволюцию по этому изменению .
Настройте обратный вызов:
Настройте уведомление:
Снеси его:
источник
Использование
-orientation
свойства ofUIDevice
является неправильным (даже если оно может работать в большинстве случаев) и может привести к некоторым ошибкам, например,UIDeviceOrientation
учитывайте также ориентацию устройства, если оно направлено вверх или вниз,UIInterfaceOrientation
для перечисления нет прямой пары в перечислении. ценности.Кроме того, если вы заблокируете свое приложение в какой-то определенной ориентации, UIDevice предоставит вам ориентацию устройства без учета этого.
С другой стороны iOS8 устарела
interfaceOrientation
собственность наUIViewController
класс.Для определения ориентации интерфейса доступно 2 варианта:
Чего еще не хватает, так это способа понять направление изменения ориентации интерфейса, что очень важно во время анимации.
На сессии WWDC 2014 «Просмотр продвижения контроллера в iOS8» докладчик также предлагает решение этой проблемы, используя заменяющий метод
-will/DidRotateToInterfaceOrientation
.Здесь предлагаемое решение частично реализовано, подробнее здесь :
источник
Я знаю, что этот вопрос для
Swift
, но так как это одна из главных ссылок для поиска Google, и если вы ищете тот же код вObjective-C
:источник
Просто, это работает в iOS8 и 9 / Swift 2 / Xcode7, просто поместите этот код в ваш viewcontroller.swift. Он будет печатать размеры экрана при каждом изменении ориентации, вместо этого вы можете указать свой собственный код:
источник
didRotateFromInterfaceOrientation()
не работает надежно. Он пропускает некоторые повороты.iewWillTransitionToSize:withTransitionCoordinator:
работает нормальноИспользуйте новый viewWillTransitionToSize (_: withTransitionCoordinator :)
источник
Мне нравится проверять уведомление об ориентации, потому что вы можете добавить эту функцию в любой класс, не нужно быть представлением или контроллером представления. Даже в вашем приложении делегат.
SWIFT 5:
чем кэширование уведомления
источник
В Задаче С
В быстром
Переопределите этот метод, чтобы обнаружить изменение ориентации.
источник
Свифт 3 | Уведомление UIDeviceOrientationDidChange наблюдается слишком часто
Следующий код печатает «deviceDidRotate» каждый раз, когда ваше устройство меняет ориентацию в трехмерном пространстве - независимо от перехода из портретной в альбомную ориентацию. Например, если вы держите свой телефон в портретной ориентации и наклоняете его вперед и назад - deviceDidRotate () вызывается повторно.
Чтобы обойти это, вы можете сохранить предыдущую ориентацию устройства и проверить наличие изменений в deviceDidRotate ().
Или вы можете использовать другое уведомление, которое вызывается только тогда, когда устройство меняет альбомную ориентацию на книжную. В этом случае вы хотите использовать
UIApplicationDidChangeStatusBarOrientation
уведомление.источник
Полная рабочая реализация того, как обнаружить изменение ориентации в Swift 3.0.
Я решил использовать эту реализацию, потому что телефонные ориентации
face up
иface down
были важны для меня, и я хотел, чтобы представление изменилось, только когда я знал, что ориентация была в указанной позиции.Важные моменты, на которые следует обратить внимание:
unknown
ориентация есть.Надеюсь, кто-то найдет это полезным.
источник
источник
Если вы хотите сделать что-то ПОСЛЕ того, как вращение завершено, вы можете использовать
UIViewControllerTransitionCoordinator
обработчик завершения следующим образомисточник
Начиная с iOS 8 это правильный способ сделать это.
источник
Проверьте, изменилось ли вращение с:
viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
С
coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)
вы можете проверить, завершен ли переход.Смотрите код ниже:
источник
Вот простой способ определить ориентацию устройства: ( Swift 3 )
источник
willRotate
устарела, лучше использоватьviewWillTransition
.Свифт 4:
Многие ответы не помогают, когда нужно обнаруживать различные контроллеры представления. Этот делает свое дело.
источник
viewWillDisappear
и добавитьaddObserver
вviewDidLoad
. iOS отписывается от просмотра контроллера автоматически.UIDevice.current.orientation.isFlat
Мой подход подобен тому, что показывает bpedit выше, но с фокусом на iOS 9+. Я хотел изменить область FSCalendar, когда представление вращается.
Это ниже работало, но я чувствовал себя застенчиво об этом :)
источник
Я использую,
UIUserInterfaceSizeClass
чтобы определить ориентацию, измененную вUIViewController
классе, вот так:источник
Для Swift 3
источник
UIDevice.current.orientation.isFlat
Swift 5
Настройка класса для получения уведомлений об изменении ориентации устройства:
Код обработчика установки:
источник
ПРИМЕЧАНИЕ. Просто используйте этот код, чтобы определить, в каком направлении находится UIViewController.
источник
источник
В iOS 13.1.2 ориентация всегда возвращает 0, пока устройство не будет повернуто. Мне нужно вызвать UIDevice.current.beginGeneratingDeviceOrientationNotifications (), чтобы получить фактическое вращение до того, как произойдет любое событие поворота.
источник