2016-10-29 6 views
0

Я ограничил ориентацию фиксированного устройства в своем приложении только на портрете. Однако, как и Instagram, у меня есть функция камеры, и мне нужно быстро получить текущую ориентацию, но ориентация всегда отображается как портрет. Есть ли способ использовать гироскоп для ручной ориентации?Как я могу определить ориентацию устройства вручную, если у меня есть ограниченная ориентация в моем приложении?

ответ

0

В Swift 2.3 вы можете использовать следующий код, чтобы установить ориентацию AVCaptureDeviceInput (или заменить его собственной функциональностью).

меня использовать этот код в https://github.com/ytakzk/Fusuma -> FSCameraView.swift

import CoreMotion 


//var videoInput: AVCaptureDeviceInput? 
let motionManager = CMMotionManager() 

if motionManager.gyroAvailable { 
    motionManager.deviceMotionUpdateInterval = 0.2; 
    motionManager.startDeviceMotionUpdates() 

    motionManager.gyroUpdateInterval = 1 
      motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!) { 
     (data: CMDeviceMotion?, error:NSError?) in 

     if let videoConnection = self.imageOutput?.connectionWithMediaType(AVMediaTypeVideo) { 
      if (data?.gravity.x)! > -0.6 && (data?.gravity.x)! < 0.6 { 
       if (data?.gravity.y)! < 0.4 { 
        videoConnection.videoOrientation = .Portrait 
       } else { 
        videoConnection.videoOrientation = .PortraitUpsideDown 
       } 
      } else { 
       if (data?.gravity.x)! < 0 { 
        videoConnection.videoOrientation = .LandscapeRight 
       } else { 
        videoConnection.videoOrientation = .LandscapeLeft 
       } 
      } 
     } 
     //print(data?.gravity.x) 
     //print(data?.gravity.y) 
     //print(data?.gravity.z) 
    } 
} 
1

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

override func viewDidLoad() { 
     super.viewDidLoad() 
     UIDevice.current.beginGeneratingDeviceOrientationNotifications() 
     NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 
    } 

    deinit { 
     UIDevice.current.endGeneratingDeviceOrientationNotifications() 
     NotificationCenter.default.removeObserver(self) 
    } 

    @objc private func orientationChanged(_ notification: Foundation.Notification) { 
     currentOrientation = UIDevice.current.orientation 
    }