айфон:сделать снимок программно
-
22-07-2019 - |
Вопрос
Я пытаюсь использовать интерфейс 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 отображается нормально.Однако метод делегата сделалFinishPickingMediaWithInfo:никогда не вызывается, и imagePickerControllerDidCancel также не вызывается.
Итак, как мне либо вызвать методы делегата, либо сохранить изображение, переопределив метод takePicture?(Я понятия не имею, как сюда захватить данные изображения, и Google, похоже, меня подвел).Я не могу избавиться от ощущения, что мне не удалось понять, как работает UIImagePickerController, но документация не слишком полезна:
например.:
«Вы можете предоставить настраиваемое представление наложения для отображения пользовательского интерфейса съемки изображений и можете инициировать съемку изображений из своего кода.Пользовательский вид наложения может отображаться в дополнение к элементам управления по умолчанию, предоставляемым интерфейсом выбора изображений, или вместо них».
или из showCameraControls:
«Если вы установите это свойство на NO и предоставите свои собственные пользовательские элементы управления, вы можете сделать несколько снимков, прежде чем увольнять интерфейс Picker». - Как мне отклонить интерфейс Picker?
Примечание:делегат правильно настроен в IB, так что проблема не в этом.
Спасибо за любую помощь, которую вы можете оказать!
Решение
Я обнаружил, что вам просто нужно подождать «достаточно долго», прежде чем звонить. takePicture
, или он просто молча терпит неудачу.У меня нет хорошего ответа на вопрос, как определить минимальное значение «достаточно долго», которое всегда будет работать, но если вы установите таймер и подождите пять или десять секунд, все будет в порядке.Было бы неплохо, если бы он возвращал какую-то ошибку «Я еще не готов сфотографировать, извините» либо напрямую из takePicture
или через делегата, но, насколько я знаю, это не так.
Другие советы
В качестве обновления к моему собственному вопросу:Оказывается, я слишком рано пытался использовать takePicture.Когда я переместил действие на кнопку наложения и отправил takePicture с этой кнопки (как только средство выбора было представлено модально), методы делегата сработали так, как и должны.Я не знаю, достижимо ли то, что я хотел - сделать изображение без необходимости автоматического нажатия этой кнопки - но если это так, то это, вероятно, придется сделать, отправив takePicture когда-нибудь после того, как я попытаюсь его использовать.
-(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];
}