iPhone: программная съемка

Я пытаюсь использовать интерфейс UIImagePickerController из OS 3.1 с cameraOverlayView и takePicture, но мне явно не удалось понять, как это работает, и поэтому я не получаю желаемого поведения.

Что я хочу сделать, так это открыть камеру и сделать снимок автоматически, не заставляя пользователя взаимодействовать с инструментом выбора или редактировать изображение. Поэтому я создаю подкласс UIImagePickerController (аналогично примеру в http://github.com/pmark/Helpful-iPhone-Utilities/tree/master/BTL%20Utilities/) и отключите все элементы управления:

- (void)displayModalWithController:(UIViewController*)controller animated:(BOOL)animated {
self.sourceType = UIImagePickerControllerSourceTypeCamera;
self.showsCameraControls = NO;
self.navigationBarHidden = YES;
self.toolbarHidden = YES;
    // Setting the overlay view up programmatically.
ipView = [[ImagePickerView alloc] init];
self.cameraOverlayView = ipView;
[controller presentModalViewController:self animated:NO];
}

В overlayView мне удалось принудительно запустить метод takePicture UIImagePickerController (я знаю это, потому что могу выполнить его NSLog, и я слышу звук камеры, делающей снимок). OverlayView отображается нормально. Однако метод делегата didFinishPickingMediaWithInfo: никогда не вызывается, и imagePickerControllerDidCancel также не вызывается.

Итак, как мне либо вызвать методы делегата, либо сохранить изображение, переопределив метод takePicture? (Я понятия не имею, как захватить здесь данные изображения, и Google, похоже, меня подвел). Я не могу избавиться от ощущения, что я не смог понять, как работает UIImagePickerController, но документы не слишком полезны:

e.g.:

"Вы можете предоставить настраиваемый вид наложения для отображения настраиваемого интерфейса для создания изображений, и вы можете инициировать съемку изображений из своего кода. Пользовательское представление наложения может отображаться в дополнение к элементам управления по умолчанию, предоставляемым изображением, или вместо них. интерфейс выбора ".

или из showCameraControls:

«Если вы установите для этого свойства значение NO и предоставите свои собственные настраиваемые элементы управления, вы можете сделать несколько снимков, прежде чем закрыть интерфейс выбора изображений». - Как мне закрыть интерфейс выбора?

Примечание: делегат правильно настроен в IB, так что проблема не в этом.

Спасибо за любую помощь, которую вы можете оказать!


person Winawer    schedule 30.10.2009    source источник


Ответы (3)


Я обнаружил, что вам просто нужно подождать «достаточно долго», прежде чем вызывать takePicture, иначе он просто откажется. У меня нет хорошего ответа, как определить минимальное значение «достаточно долго», которое всегда будет работать, но если вы установите таймер и подождите пять или десять секунд, все должно быть в порядке. Было бы неплохо, если бы он возвращал какую-то ошибку «Я еще не готов сделать снимок, извините» либо напрямую от takePicture, либо через делегата, но, насколько я знаю, это не так.

person David Maymudes    schedule 30.10.2009

В качестве обновления моего собственного вопроса: оказалось, что я слишком рано пытался использовать takePicture. Когда я переместил действие на кнопку на наложении и отправил takePicture с этой кнопки (после того, как средство выбора было представлено модально), методы делегата сработали, как должны. Я не знаю, достижимо ли то, что я хотел - сделать снимок без необходимости нажимать эту кнопку, автоматически - но если это так, то, вероятно, придется отправить takePicture через некоторое время после того, как я попытаюсь его использовать.

person Winawer    schedule 30.10.2009

- (void) imageMethod: (id) отправитель {imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

imagePopover=[[UIPopoverController alloc]initWithContentViewController:imagePickerController];
[imagePopover presentPopoverFromRect:importButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
person vignesh.P    schedule 05.02.2016