proximityMonitoring может не работать должным образом

для моего приложения iOS я хочу реализовать функцию, в которой экран должен отключиться (например, когда вы отвечаете на телефонный звонок), когда устройство стоит на месте. поэтому я начал с определения ориентации устройства:

//in my ViewDidLoad NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.rotated(_:)), name: UIDeviceOrientationDidChangeNotification, object: nil) //called when the device changes orientation func rotated(notification: NSNotification){ if UIDevice.currentDevice().orientation == UIDeviceOrientation.FaceDown{ print("device = faced down") }else{ print("device != faced down") } } 

когда устройство выключено, я позвонил

 UIDevice.currentDevice().proximityMonitoringEnabled = true 

еще

 UIDevice.currentDevice().proximityMonitoringEnabled = false 

проблема в UIDeviceOrientationDidChangeNotification кажется немного запоздалой, поэтому, когда вызывается UIDeviceOrientationDidChangeNotification rotated() , устройство уже обращено вниз, и получается, что для того, чтобы proximityMonitoringEnabled = true чтобы отключить экран, датчик приближения не должен быть уже покрытый! Я уверен, что это ограничение Apple, но, возможно, кто-то там нашел решение или наткнулся на обходное решение! заранее спасибо.

One Solution collect form web for “proximityMonitoring может не работать должным образом”

Подход:

Поскольку iOS не предоставляет перед изменением ориентации, мы не можем полагаться на ' UIDeviceOrientationDidChangeNotification '. Вместо этого мы можем использовать CoreMotion Framework и получить доступ к гироскопу аппаратного обеспечения для обнаружения возможных ориентаций FaceDown и соответствующим образом установить proximityMonitoringEnabled.

Данные гироскопа:

Использование наблюдений гироскопа ниже значений может, возможно, определять ориентацию FaceDown.

 let gyroData = (minX:-3.78, minY:-3.38, minZ:-5.33, maxX:3.29, maxY:4.94, maxZ:3.36) 

Решение в Swift:

 class ProximityViewController: UIViewController { let cmManager = CMMotionManager(), gyroData = (minX:-3.78, minY:-3.38, minZ:-5.33, maxX:3.29, maxY:4.94, maxZ:3.36) override func viewDidLoad() { super.viewDidLoad() //Using GyroMotion experimentCoreMotion() } //MARK: - Using Core Motion func experimentCoreMotion() { if cmManager.gyroAvailable { //Enable device orientation notification UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications() cmManager.gyroUpdateInterval = 0.1 handleFaceDownOrientation() } } func handleFaceDownOrientation() { cmManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (data:CMGyroData?, error: NSError?) in if self.isGyroDataInRange(data!) { UIDevice.currentDevice().proximityMonitoringEnabled = (UIDevice.currentDevice().orientation == .FaceDown) if UIDevice.currentDevice().orientation == .FaceDown { print("FaceDown detected") } else { print("Orientation is not facedown") } } }) } func isGyroDataInRange(val: CMGyroData) -> Bool { return ((val.rotationRate.x > gyroData.minX && val.rotationRate.x < gyroData.maxX) && (val.rotationRate.y > gyroData.minY && val.rotationRate.y < gyroData.maxY) && (val.rotationRate.z > gyroData.minZ && val.rotationRate.z < gyroData.maxZ)) } } 

Надеюсь, мое решение решает ваш запрос. Позвольте мне знать, что решение отлично работает для вашего требования.

Наблюдения за гироскопом и акселерометром:

Я экспериментировал с возможными значениями ориентации FaceDown с помощью гироскопа и акселерометра. IMO, данные гироскопа кажутся прекрасными, но они открыты для изучения других аппаратных датчиков для обнаружения FaceDown Orientation.

  • Почему UIUserNotificationType.None возвращает true в текущих настройках, когда предоставляется разрешение пользователя?
  • Вход в Facebook с парсером в iOS9 и Swift2
  • Как использовать NSRegularExpression в Swift 2.0 в xcode 7
  • UITextField для ввода суммы денег
  • Расшифровывайте медиафайлы в кусках и играйте через AVPlayer
  • Прогресс запроса Alamofire
  • Swift 2 неиспользованное постоянное предупреждение
  • Быстрый бросок от закрытия, вложенного в функцию
  • Как заставить коллекцию просматривать ответные жесты за пределами своего собственного вида
  • Swift 2.0 для приглашения на Facebook
  • Отправлено из «MDLMaterialProperty ?!»?
  • Как получить AVPlayer на веб-странице с помощью WKWebView в swift?
  • Interesting Posts

    Ad hoc .ipa не устанавливает с помощью iTune

    Как запросить последнюю дату изменения файла через HTTP на iPhone с помощью NSHTTPURLResponse?

    Что такое ошибка Core Audio 561015905 и почему это происходит, когда я пользуюсь кнопкой блокировки?

    UICollectionViewCell для полноэкранного перехода

    Утечка памяти на быстрой игровой площадке / deinit {} не называется последовательно

    XMPPFramework – Как добавить пользователей в MUC Room

    UIStackView перемещает организованные подпрограммы в верхнем левом углу, когда все подпункты скрыты внутри блока анимации

    Значки приложений iOS 7, запуск изображений и соглашение об именах при хранении iOS 6 Icons

    как найти аудиоустройства Bluetooth в iOS

    NSURL: URLByAppendingPathComponent: конвертирует? в% 3F, но тогда UIWebView отменяет это преобразование, приводящее к сбоям нагрузки

    Объекты программного центра iOS

    В чем разница между одиночными векторными и векторными переопределениями?

    Добавить шрифт .otf в приложение iphone

    NSURLSession didReceiveChallenge только один раз

    Swift: как обернуть метод асинхронного синхронного метода?

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