对于我的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
似乎有点迟了所以当调用rotated()
函数时,设备已经面朝下了,结果是proximityMonitoringEnabled = true
为pg-promise
关闭屏幕接近传感器不应该被覆盖!
我很确定这是Apple的限制,但也许有人确实找到了解决方案或遇到了解决方法!
提前谢谢。
答案 0 :(得分:1)
<强>方法强>
由于iOS在更改Orientation之前未提供,因此我们无法依赖' UIDeviceOrientationDidChangeNotification '。相反,我们可以使用CoreMotion Framework并访问硬件的陀螺仪来检测可能的FaceDown方向,并适当地设置proximityMonitoringEnabled。
陀螺仪数据:
使用下面的陀螺仪观察值可能会检测到FaceDown Orientation。
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))
}
}
希望我的解决方案能够解决您的疑问。请告诉我,解决方案可以满足您的要求。
陀螺仪&amp;加速度计观测:
我使用陀螺仪和放大器实验了FaceDown方向的可能值。加速度计。 IMO,陀螺仪数据似乎很好但是它可以探索其他硬件的传感器以检测FaceDown方向。