iPhone: фотографировать программно - PullRequest
1 голос
/ 30 октября 2009

Я пытаюсь использовать интерфейс 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];
}

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

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

например:.

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

или из showCameraControls:

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

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

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

Ответы [ 3 ]

2 голосов
/ 30 октября 2009

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

0 голосов
/ 05 февраля 2016

- (Недействительными) imageMethod: (идентификатор) отправитель { imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

imagePopover=[[UIPopoverController alloc]initWithContentViewController:imagePickerController];
[imagePopover presentPopoverFromRect:importButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
0 голосов
/ 30 октября 2009

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

...