Снимание и фильмы
Деление снимка или фильма с контроллером средства выбора изображения является тремя процессами части, продолжающимися как взаимодействие между Вашим кодом и системой:
Вы инстанцируете и модально представляете интерфейс камеры — экземпляр
UIImagePickerController
класс.Система управляет интерфейсом камеры и взаимодействием пользователя с ним. В типичном использовании пользователь или делает снимок или фильм, или отменяет работу.
Система вызывает Вашего делегата контроллера средства выбора изображения методы объекта, поочередно обрабатывающие результаты взаимодействия пользователя — например, сохранив новую картинку к альбому Рулона Камеры. Делегат также ответственен за отклонение интерфейса камеры.
Контроллер средства выбора изображения по умолчанию включает множество функций, как показано на рисунке 1.
Эта глава объясняет, как использовать контроллер средства выбора изображения по умолчанию и делегата к тому, чтобы снять и фильмы. (Запись фильма является доступным запуском в iOS 3.0 на поддерживаемых устройствах).
Чтобы изучить, как вместо этого использовать платформу Основы AV для полностью настроенного получения носителей, посмотрите Получение Носителей и Доступ к Камере в Руководстве по программированию Основы AV.
Создание и конфигурирование интерфейса камеры
Для представления интерфейса камеры необходимо сначала гарантировать, что существуют три вещи:
Устройство, на котором работает Ваше приложение, должно иметь камеру.
Если снимание или фильмы важно для Вашего приложения, укажите это путем конфигурирования
UIRequiredDeviceCapabilities
введите свое приложениеInfo.plist
файл списка свойств. Посмотрите UIRequiredDeviceCapabilities в информационной Ключевой Ссылке Списка свойств для различных характеристик камеры, которые можно указать как требуется.Если получение носителей является случайным фактом к Вашему приложению — т.е. если Ваше приложение остается полезным, даже если устройство не имеет камеры — тогда, Ваш код должен следовать за обходным путем при работе устройства без камеры.
Камера устройства должна быть доступна для Вас для использования, который можно протестировать посредством
isSourceTypeAvailable:
метод класса изUIImagePickerController
класс.Вы, должно быть, реализовали объект делегата реагировать на взаимодействие пользователя с контроллером средства выбора изображения. (См. Реализацию Делегата к Интерфейсу Камеры.)
С теми удовлетворенными предпосылками создайте и затем сконфигурируйте контроллер средства выбора изображения путем указания следующих опций:
Исходный тип Для конфигурирования средства выбора для получения носителей в противоположность просмотру сохраненных носителей установите
sourceType
свойство кUIImagePickerControllerSourceTypeCamera
.Типы среды, Чтобы указать, может ли пользователь взять неподвижные изображения, фильмы или обоих, устанавливают
mediaTypes
свойство к массиву, содержащему идентификаторы для желаемых типов. Допустимые значения для элементов массиваkUTTypeImage
иkUTTypeMovie
.Однако прежде, чем установить это свойство, проверьте, который типы среды доступны путем вызова
availableMediaTypesForSourceType:
метод класса. Если Вы устанавливаетеmediaTypes
свойство к пустому массиву, или к массиву, в котором ни один из типов среды не доступен для текущего источника, система, выдает исключение.Редактирование средств управления, Чтобы указать, должен ли интерфейс камеры предложить контроль за работой пользователей для перемещения и масштабирования полученного изображения, или для обрезки полученного фильма, установило
allowsEditing
свойство кYES
(для обеспечения средств управления редактированием) или кNO
.При использовании встроенных средств управления редактированием контроллер средства выбора изображения осуществляет определенные опции. Для неподвижных изображений средство выбора осуществляет квадратную обрезку, а также максимальную пиксельную размерность. Для фильмов средство выбора осуществляет максимальную длину фильма и разрешение. Если Вы хотите позволить пользователю отредактировать полноразмерные носители или указать пользовательскую обрезку, необходимо обеспечить собственное редактирование UI.
Объект делегата Наконец, присвойте свой объект делегата контроллеру средства выбора изображения
delegate
свойство.
Перечисление 1 проверяет, что предпосылки удовлетворены посредством его сигнатуры метода и условного теста, и продолжает инстанцировать, конфигурировать, и асинхронно представлять полный экран пользовательского интерфейса камеры.
Перечисление 1 , Представляющее камеру, соединяет интерфейсом с полным экраном
- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller |
usingDelegate: (id <UIImagePickerControllerDelegate, |
UINavigationControllerDelegate>) delegate { |
if (([UIImagePickerController isSourceTypeAvailable: |
UIImagePickerControllerSourceTypeCamera] == NO) |
|| (delegate == nil) |
|| (controller == nil)) |
return NO; |
UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; |
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; |
// Displays a control that allows the user to choose picture or |
// movie capture, if both are available: |
cameraUI.mediaTypes = |
[UIImagePickerController availableMediaTypesForSourceType: |
UIImagePickerControllerSourceTypeCamera]; |
// Hides the controls for moving & scaling pictures, or for |
// trimming movies. To instead show the controls, use YES. |
cameraUI.allowsEditing = NO; |
cameraUI.delegate = delegate; |
[controller presentModalViewController: cameraUI animated: YES]; |
return YES; |
} |
Перечисление 1 обеспечивает средство выбора, позволяющее пользователю получить неподвижные изображения и фильмы, если оба доступны на устройстве. Чтобы вместо этого представить средство выбора, получающее только фильмы, например, гарантируют, что получение фильма доступно и затем набор mediaTypes
свойство следующим образом:
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil]; |
(Чтобы гарантировать, что получение фильма доступно, вызовите availableMediaTypesForSourceType:
метод класса.)
Для средства выбора, получающего только неподвижные изображения, замена kUTTypeMovie
идентификатор здесь с kUTTypeImage
, или полагайтесь на значение по умолчанию mediaTypes
свойство, которое является kUTTypeImage
.
startCameraControllerFromViewController:usingDelegate:
метод в качестве примера от Перечисления 1 разработан, чтобы быть вызванным методом действия, таким как это:
- (IBAction) showCameraUI { |
[self startCameraControllerFromViewController: self |
usingDelegate: self]; |
} |
Заметьте, как указано в сигнатуре метода в Перечислении 1, что объект делегата должен соответствовать UIImagePickerControllerDelegate
и UINavigationControllerDelegate
протоколы.
Результат startCameraControllerFromViewController:usingDelegate:
метод в качестве примера - то, что система модально выводит на экран стандартный интерфейс камеры, включая средства управления для получения носителей или отмены, как показано на рисунке 1.
Реализация делегата к интерфейсу камеры
Когда пользователь касается кнопки в интерфейсе камеры, чтобы принять недавно полученное изображение или фильм, или просто отменить работу, система уведомляет делегата относительно выбора пользователя. Система, однако, не отклоняет интерфейс камеры. Делегат должен отклонить его путем вызова dismissModalViewControllerAnimated:
метод и должен выпустить интерфейс также. Именно по этой причине, обычно, Вы делаете контроллер представления, представляющий двойной режим работы подачи интерфейса камеры как делегата.
Перечисление 2 показывает реализации в качестве примера методов делегата для контроллера средства выбора изображения. imagePickerController:didFinishPickingMediaWithInfo:
реализация включает код для того, чтобы сохранить неподвижный образ или фильм, в зависимости от того, что получил пользователь.
Методы делегата перечисления 2 для интерфейса камеры
@implementation CameraViewController (CameraDelegateMethods) |
// For responding to the user tapping Cancel. |
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker { |
[[picker parentViewController] dismissModalViewControllerAnimated: YES]; |
[picker release]; |
} |
// For responding to the user accepting a newly-captured picture or movie |
- (void) imagePickerController: (UIImagePickerController *) picker |
didFinishPickingMediaWithInfo: (NSDictionary *) info { |
NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType]; |
UIImage *originalImage, *editedImage, *imageToSave; |
// Handle a still image capture |
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) |
== kCFCompareEqualTo) { |
editedImage = (UIImage *) [info objectForKey: |
UIImagePickerControllerEditedImage]; |
originalImage = (UIImage *) [info objectForKey: |
UIImagePickerControllerOriginalImage]; |
if (editedImage) { |
imageToSave = editedImage; |
} else { |
imageToSave = originalImage; |
} |
// Save the new image (original or edited) to the Camera Roll |
UIImageWriteToSavedPhotosAlbum (imageToSave, nil, nil , nil); |
} |
// Handle a movie capture |
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie, 0) |
== kCFCompareEqualTo) { |
NSString *moviePath = [[info objectForKey: |
UIImagePickerControllerMediaURL] path]; |
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) { |
UISaveVideoAtPathToSavedPhotosAlbum ( |
moviePath, nil, nil, nil); |
} |
} |
[[picker parentViewController] dismissModalViewControllerAnimated: YES]; |
[picker release]; |
} |
@end |
Если редактирование изображение включено, и пользователь успешно принимает недавно полученное изображение, информационный параметр imagePickerController:didFinishPickingMediaWithInfo:
метод содержит словарь, включающий отредактированное изображение. Обработайте это изображение как выбранное изображение, как сделано в Перечислении 2. Если Вы хотите сохранить исходное изображение, можно получить его из словаря, также как показано в листинге кода.
Вместо того, чтобы сразу сохранить новый элемент носителей к Рулону Камеры пользователя как показано в этом примере, Вы могли вместо этого вызвать пользовательский код для работы с носителями.