タッチした所で露出を合わせる方法
AVCaptureExposureModeContinuousAutoExposure で露出を合わせて、key-value observe を使って adjustingExposure が NO(合わせ終わった!)になるのを検出して AVCaptureExposureModeLocked にしろと。
結局こんな感じで露出合わせを始めて
if( [device isExposurePointOfInterestSupported] && [device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) { NSError *error; if ([device lockForConfiguration:&error]) { [device addObserver:self forKeyPath:@"adjustingExposure" options:NSKeyValueObservingOptionNew context:nil]; device.exposurePointOfInterest = newPoint; device.exposureMode = AVCaptureExposureModeContinuousAutoExposure; [device unlockForConfiguration]; } }
露出合わせが終わったらこう受ける。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqual:@"adjustingExposure"]) { if ([[change objectForKey:NSKeyValueChangeNewKey] boolValue] == NO) { NSError *error = nil; if ([device lockForConfiguration:&error]) { [device setExposureMode:AVCaptureExposureModeLocked]; [device unlockForConfiguration]; } } } }
2011/12/03 Update:
値が変わったという知らせかどうかを確認する if 分の条件式を修正しました。
コチラでコードの不備を教えていただきました。ありがとうございます。
というわけで、このコード(要約)でとりあえず動いているけど iPhone 4 でサポートされてなかった AVCaptureExposureModeAutoExpose はどのモデルでサポートされるのかな?もしかしたら iPhone 4S だとサポートされてたりする???