iPhone4でサポートされてない露出モードのエラーが出たけど
iPhone 4でカメラ機能を使ったアプリケーションを作ってみているのだけど、タッチした所で露出を合わせようと思ったらこんなエラーが出た。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Setting exposureMode (1) is not supported by this device. Use isExposureModeSupported:'
フォーカスする時みたいに exposurePointOfInterest で場所を指定して AVCaptureExposureModeAutoExpose をするのかな?と思ってこんなコードを書いてみたんだけど…。
if( [device isExposurePointOfInterestSupported] ) { NSError *error; if ([device lockForConfiguration:&error]) { device.exposurePointOfInterest = newPoint; device.exposureMode = AVCaptureExposureModeAutoExpose; [device unlockForConfiguration]; } }
で、ググったらこんなページが!
タッチした所で露出を合わせる方法
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 だとサポートされてたりする???