我注意到在我的iPhone上,在阳光直射的几秒钟后,屏幕会调整变得更亮,更暗等。 我想知道是否有一种方法可以与这个传感器互动?
我有一个应用程序,是在室外使用的。 当你进入直射光线时,在屏幕调整之前,你很难看到屏幕几妈的情况。 而且即使这样,也不总是像我希望的那样明亮。 我想实现室外观看时用高对比度的皮肤,室内观看时用低对比度的皮肤。
这是否可以读取光线传感器数据,如果可以,我如何提取这些传感器值?
我假设有一个光线传感器,但是,相机知道何时使用闪光灯。
尝试使用 GSEventSetBacklightLevel();
,这需要 <GraphicsServices/GraphicsServices.h>
. 这样就可以通过编程来调整亮度级别。还有一个 get
选项,所以我想这可能有你想要的信息。
另一方面,这是一个不同的想法(也许是一个愚蠢的想法),使用设备的屏幕亮度,你可以得到一些外部条件的值。
从0.12(暗)到0.99(亮)。
下一行会得到这些数值,试一试,在设备上放一些光和关灯,得到不同的数值。
NSLog(@"Screen Brightness: %f",[[UIScreen mainScreen] brightness]);
很明显,自动亮度功能应该被打开,以使其工作。
请注意。
要读取环境光传感器的数据,你需要使用IOKit框架中的IOHID。
http:/iphonedevwiki.netindex.phpAppleISL29003
http:/iphonedevwiki.netindex.phpIOKit.framework。
但是,这需要私人头像,所以如果你使用它,苹果可能不会让你的应用进入应用商店。
我不断在iOS论坛上询问未来是否会支持环境光传感器读数,但没有结果。
实际上,你可以使用相机来做这件事,这与用户的屏幕亮度设置无关(即使在自动亮度为OFF的情况下也能工作)。
你可以从视频帧的元数据中读取亮度值,正如我在 这个Stack Overflow答案.
对于Swift 5来说,以下是如何使用亮度检测,它可以间接给你外面的光度。
/// A view controller (you can use any UIView or AnyObj)
class MyViewConroller: UIViewController {
/// Remove observers on deinit
deinit {
removeObservers()
}
// MARK: - Observers management helpers
/// Add my observers to the vc
func addObservers() {
NotificationCenter.default.addObserver(self, selector: #selector(onScreenBrightnessChanged(_:)), name: UIScreen.brightnessDidChangeNotification, object:nil)
}
/// Clean up observers
func removeObservers() {
NotificationCenter.default.removeObserver(self)
}
/// Load the views
func loadView() {
// Add my observes to the vc
addObservers()
}
/**
Handles brightness changes
*/
@objc func onScreenBrightnessChanged(_ sender: Notification) {
// Tweak as needed: 0.5 is a good value for me
let isDark = UIScreen.main.brightness < 0.5. // in 0...1
// Do whatever you want with the `isDark` flag: here I turn the headlights off
vehicle.turnOnTheHeadlights( isDark )
}
}