torchLevel KVO - iOS

时间:2015-02-12 22:37:37

标签: ios iphone avfoundation key-value-observing

我在iOS中使用AVFoundation操作iPhone 6上的手电筒。我需要知道当前的手电筒水平。

我已经在AppleDevLib中读到可以使用KVO观察当前的火炬等级,但我未能实现这一点。

你可以放下一些检测火炬等级变化然后更改变量(如屏幕上的标签等)的样品吗?这对我很有帮助。

1 个答案:

答案 0 :(得分:0)

我花了一段时间才弄清楚如何做到这一点,但我相信这个KVO代码对你有用。我没有彻底测试这个代码,但我确实得到它基本上在应用程序中工作:

static void * const torchLevelObservationContext = (void*)&torchLevelObservationContext;

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == torchLevelObservationContext) {
        AVCaptureDevice *thisDevice = (AVCaptureDevice*)object;
        NSLog( @"Current torch level: %f", thisDevice.torchLevel);
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

-(id) init {
    if (self = [super init]) {
        AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        [videoDevice addObserver:self forKeyPath:@"torchLevel" options:NSKeyValueObservingOptionNew context:torchLevelObservationContext];

        // whatever other initialization code ...
    }
    return self;
}

警告:我尝试使用此代码的主要原因是确定通过控制中心打开的火炬的当前状态,以便在使用AVCaptureDevice时将其保持打开状态一旦捕获开始,火炬因某种原因被关闭。但无论我尝试了什么(torchActive,torchMode,torchLevel),我都无法确定状态。此代码似乎只有在控制AVCaptureDevice并使用AVCaptureSession后才能工作。如果有人知道如何获得从控制中心打开的手电筒或手电筒的当前状态,那就是我想要做的。