Как настроить данные CMMotionManager для ориентации в iOS 8?

Мое приложение использует CMMotionManager для отслеживания движения устройства, но iOS всегда возвращает данные движения устройства в стандартной ориентации устройства (кнопка дома внизу).

Чтобы получить данные движения в ту же ориентацию, что и мой UIView, я собираю преобразования вида из моего представления в окно следующим образом:

CGAffineTransform transform = self.view.transform; for (UIView *superview = self.view.superview; superview; superview = superview.superview) { CGAffineTransform superviewTransform = superview.transform; transform = CGAffineTransformConcat(transform, superviewTransform); } 

Это преобразование правильно вычисляется в iOS 6 и 7, но iOS 8 изменяет модель вращения, и теперь представления всегда возвращают преобразование идентичности (без вращения) независимо от того, как устройство ориентировано. Однако данные от менеджера движения все еще фиксированы в стандартной ориентации.

Мониторинг уведомлений о ротации UIDevice и ручной расчет четырех преобразований походит на один подход к получению этого преобразования под iOS 8, но это также кажется плохим, поскольку ориентация устройства не обязательно будет соответствовать ориентации моего представления (т. Е. Потенциал роста на iPhone – это ориентация устройства, а не обычно поддерживается).

Каков наилучший способ получить результат от CMMotionManager в ориентации определенного UIView в iOS 8?

2 Solutions collect form web for “Как настроить данные CMMotionManager для ориентации в iOS 8?”

Хотя это и не очень очевидно, рекомендуемый способ сделать это в iOS 8 и более поздних версиях – с координаторами перехода.

В viewWillTransition(to:with:) координатор может передать вам экземпляр, принимающий UIViewControllerTransitionCoordinatorContext в блоках завершения любого из его методов, которые вы вызываете (координатор по умолчанию, используемый UIKit, на самом деле является его собственным контекстом, но это не обязательно так ).

Свойство targetTransform контекста – это поворот, который должен применяться к интерфейсу к концу анимации. Обратите внимание, что это относительное преобразование, а не результирующее абсолютное преобразование интерфейса.

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) let animation: (UIViewControllerTransitionCoordinatorContext) -> Void = { context in // your animation } coordinator.animate(alongsideTransition: animation) { context in // store the relative rotation (or whatever you need to do with it) self.transform = context.targetTransform } } 

В то время как старый подход все еще работает, этот API, по-видимому, больше соответствует будущему направлению пользовательских интерфейсов Apple, и это обеспечивает большую гибкость, когда вам нужно управлять анимированными переходами.

Я не мог найти способ напрямую вычислить преобразование, поэтому вместо этого я изменил свой код, чтобы вычислить преобразование вручную, когда в моем контроллере представления получено сообщение willRotateToInterfaceOrientation:

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { CGAffineTransform transform; switch (toInterfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: transform = CGAffineTransformMake( 0, -1, 1, 0, 0, 0); break; case UIInterfaceOrientationLandscapeRight: transform = CGAffineTransformMake( 0, 1, -1, 0, 0, 0); break; case UIInterfaceOrientationPortraitUpsideDown: transform = CGAffineTransformMake( -1, 0, 0, -1, 0, 0); break; case UIInterfaceOrientationPortrait: transform = CGAffineTransformIdentity; break; } self.motionTransform = transform; } 
  • Недостатки использования CGMutablePathRef?
  • Добавление дополнений к UIView
  • На iOS, как сделать динамический список «ссылок» или кнопок вызывать метод со строковым аргументом?
  • convertRect: toView: возвращает двойной размер и удваивает расстояние от начала координат
  • UICollectionView перетаскивает палец по ячейкам, чтобы выбрать их
  • Как отменить UIWebView?
  • UITextView плавающий синий ящик при прокрутке
  • Предотвращение анимированного внешнего вида UICollectionViewCell при представлении UICollectionView
  • Принудительная автоматизация Маска для применения к UIView
  • 3D Touch Peek Swipe Like Mail
  • Что произойдет, если пользователь закроет приложение, которое уже находится в фоновом режиме?
  • Interesting Posts

    Огромные изображения в приложении iOS без CATiledLayer?

    Предупреждение о домашней кнопке iOS, возможно ли это?

    Формат String – это не буквальная строка (потенциально небезопасная) предупреждение

    пользовательские схемы URL-адресов в твиттер-сообщениях не работают

    UIView с динамической высотой несколько UILabel

    Ошибка компоновщика Xcode: слишком маленький файл для архитектуры x86_64

    Инструмент Core Animation – FPS из 60

    Центрирование столбца переменной ширины текста в UIScrollView с использованием автоматической компоновки

    IOS. UITextView. Текстовый прыжок после UIKeyboardDidHideNotification

    Как улучшить NSFetchedResultsController performFetch: производительность?

    Кнопка Tableview получает index.row

    Ошибка при просмотре с помощью uinavigationbar до одного без

    Встраивание UIViewcontrollers внутри UICollectionviewCells

    Swift 3 – Как заставить таймер работать в фоновом режиме

    Ошибка автоматической компоновки

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.