#ios #uiimagepickercontroller
#iOS #uiimagepickercontroller
Вопрос:
Привет, я создаю приложение altered reality. Мой основной контроллер является производным от UIImagePickerController. Вот как я его создаю:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.overlayController) {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
self.sourceType = UIImagePickerControllerSourceTypeCamera;
self.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
self.cameraDevice = UIImagePickerControllerCameraDeviceRear;
self.showsCameraControls = false;
self.allowsEditing = false;
self.overlayController = [[[ControlsViewController alloc] initWithNibName:@"ControlsViewController" bundle:[NSBundle mainBundle] picker:self] autorelease];
[self.view addSubview:self.overlayController.view]; // need to add as subview otherwise mouse events captured by UIImagePickerController
self.overlayController.view.frame = CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height);
}
}
[cameraControls setCamera:self];
}
В основном контроллер существует на протяжении всего жизненного цикла приложения. Теперь, когда я делаю снимок с кодом ниже, большую часть времени он работает нормально, но иногда didFinishPickingMediaWithInfo не вызывается. Обычное поведение: я вижу, что фокус камеры начинает регулировать включение / выключение размытия, а затем стабилизируется, но didFinishPickingMediaWithInfo никогда не будет вызываться. Похоже, что если камера переходит в какой-то режим калибровки, это может не вызвать это событие. У кого-нибудь есть решение? Я надеюсь, что, возможно, есть какой-то дополнительный обратный вызов (например, обработка ошибок отсутствует).
Я даже слышу, как звук, имитируемый затворами камеры, прерывается, когда камера переходит в этот странный режим калибровки.
//self.cameraPicker points to the instance of my main controller that I created earlier
-(void) setCamera:(UIImagePickerController *)picker {
self.cameraPicker = picker;
picker.delegate = self;
}
-(void) takePicture {
[self.cameraPicker takePicture];
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(@"Picture ready");
}
Комментарии:
1. Найден корень моей проблемы. Я вызывал функцию takePicture из потока таймера. Как только я переключился на получение его из обработчика событий нажатия кнопки, все работает нормально. Похоже, что-то неприятное происходит, если оно не в том же потоке? Я просто предполагаю здесь.