Снимание и фильмы

Деление снимка или фильма с контроллером средства выбора изображения является тремя процессами части, продолжающимися как взаимодействие между Вашим кодом и системой:

  1. Вы инстанцируете и модально представляете интерфейс камеры — экземпляр UIImagePickerController класс.

  2. Система управляет интерфейсом камеры и взаимодействием пользователя с ним. В типичном использовании пользователь или делает снимок или фильм, или отменяет работу.

  3. Система вызывает Вашего делегата контроллера средства выбора изображения методы объекта, поочередно обрабатывающие результаты взаимодействия пользователя — например, сохранив новую картинку к альбому Рулона Камеры. Делегат также ответственен за отклонение интерфейса камеры.

Контроллер средства выбора изображения по умолчанию включает множество функций, как показано на рисунке 1.

Рисунок 1  контроллер средства выбора изображения

Эта глава объясняет, как использовать контроллер средства выбора изображения по умолчанию и делегата к тому, чтобы снять и фильмы. (Запись фильма является доступным запуском в iOS 3.0 на поддерживаемых устройствах).

Чтобы изучить, как вместо этого использовать платформу Основы AV для полностью настроенного получения носителей, посмотрите Получение Носителей и Доступ к Камере в Руководстве по программированию Основы AV.

Создание и конфигурирование интерфейса камеры

Для представления интерфейса камеры необходимо сначала гарантировать, что существуют три вещи:

  1. Устройство, на котором работает Ваше приложение, должно иметь камеру.

    Если снимание или фильмы важно для Вашего приложения, укажите это путем конфигурирования UIRequiredDeviceCapabilities введите свое приложение Info.plist файл списка свойств. Посмотрите UIRequiredDeviceCapabilities в информационной Ключевой Ссылке Списка свойств для различных характеристик камеры, которые можно указать как требуется.

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

  2. Камера устройства должна быть доступна для Вас для использования, который можно протестировать посредством isSourceTypeAvailable: метод класса из UIImagePickerController класс.

  3. Вы, должно быть, реализовали объект делегата реагировать на взаимодействие пользователя с контроллером средства выбора изображения. (См. Реализацию Делегата к Интерфейсу Камеры.)

С теми удовлетворенными предпосылками создайте и затем сконфигурируйте контроллер средства выбора изображения путем указания следующих опций:

Перечисление 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. Если Вы хотите сохранить исходное изображение, можно получить его из словаря, также как показано в листинге кода.

Вместо того, чтобы сразу сохранить новый элемент носителей к Рулону Камеры пользователя как показано в этом примере, Вы могли вместо этого вызвать пользовательский код для работы с носителями.