Как настроить данные 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; } 
  • Как удалить «нечеткую» тень в UIPopoverController
  • UITableViewAutomaticDimension не работает до прокрутки
  • Плохой доступ к
  • Выравнивание заголовков UIButton и многострочная поддержка
  • Как перевести OpenGLES modelView в CATransform3D?
  • Взаимодействие между представлением / представлением контроллеров просмотра и контроллерами родительского / дочернего просмотра, документально написанными в любом месте?
  • Настройка ограничений автоматической компоновки для иерархии программных представлений?
  • Пользовательский пейджинг UIScrollView с scrollViewWillEndDragging
  • Компиляция приложения, работающего в iOS 6 и iOS 7
  • UILocalNotifications пока приложение находится на переднем плане
  • Пользовательское анимированное свойство возвращает NSNull?
  • UICollectionView Просмотр заголовка и нижнего колонтитула
  • Interesting Posts

    проблема с clipToBounds и masksToBounds

    Возможно ли иметь многострочный textLabel в UITableViewHeaderFooterView (без использования пользовательского UILabel)?

    iOS – AVFoundation – Можно ли установить целое видео как замедленное движение?

    Получите действие подключенного наушника bluetooth в IOS7

    Приложение попыталось нажать контроллер представления nil на цель <MFMessageComposeViewController: 0x96d1380>

    Загрузка списка из 100 файлов по одному с использованием NSURLSession в фоновом режиме

    iOS UITesting: автоматически обрабатывать все системные подсказки с помощью addUIInterruptionMonitorWithDescription

    Как локализовать метку доступности

    Как искать идентификатор Segue в раскадровке?

    Автозаполнение в IOS Xamarin

    ios: универсальные ссылки, не работающие на iOS 10

    iOS> возможно воспроизведение частично загруженного видео?

    Создание XML-документов с помощью GDataXML

    Как использовать SWRevealViewController с iPad SplitViewController

    Как установить приложение iOS для использования USB-аудио для ввода и вывода на внутренние колонки

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