Читаем iOS. Приемы программирования полностью

Требуется попросить пользователя сделать снимок (фотография выполняется камерой устройства). После того как пользователь сделает снимок, необходимо получить доступ к этой фотографии.

Решение

Инстанцируйте объект типа UIImagePickerController и представьте его пользователю как модальный вид в актуальном контроллере вида. Вот объявление этого контроллера вида:


#import «ViewController.h»

#import 


@interface ViewController 

UINavigationControllerDelegate>


@end


@implementation ViewController


<# Остаток вашего кода находится здесь #>


Делегат экземпляра UIImagePickerController должен соответствовать протоколам UINavigationControllerDelegate и UIImagePickerControllerDelegate. Если вы забудете включить их в. h-файл вашего объекта-делегата, то будете получать предупреждения от компилятора при присвоении значения делегатному свойству контроллера для выбора изображений. Не забывайте, что вы можете присваивать делегату объект экземпляра UIImagePickerController и в том случае, если данный объект не соответствует явно протоколам UIImagePickerControllerDelegate и UINavigationControllerDelegate, но реализует методы, необходимые в этих протоколах. Тем не менее я советую «подсказывать» компилятору, что фактически объект-делегат соответствует вышеупомянутым протоколам, — так вы избавитесь от лишних предупреждений компилятора.

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


— (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear: animated];


static BOOL beenHereBefore = NO;


if (beenHereBefore){

/* Отображаем элемент для выбора даты только после того, как вызывается

метод viewDidAppear:, что происходит при каждом отображении вида

нашего контроллера вида */

return;

} else {

beenHereBefore = YES;

}


if ([self isCameraAvailable] &&

[self doesCameraSupportTakingPhotos]){


UIImagePickerController *controller =

[[UIImagePickerController alloc] init];


controller.sourceType = UIImagePickerControllerSourceTypeCamera;


NSString *requiredMediaType = (__bridge NSString *)kUTTypeImage;

controller.mediaTypes = [[NSArray alloc]

initWithObjects: requiredMediaType, nil];


controller.allowsEditing = YES;

controller.delegate = self;


[self.navigationController presentModalViewController: controller

animated: YES];


} else {

NSLog(@"Camera is not available.");

}

}

В этом примере пользуемся методами isCameraAvailable и doesCameraSupportTakingPhotos. Эти методы реализованы и подробно рассмотрены в разделе 13.1.

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


— (void) imagePickerController:(UIImagePickerController *)picker

didFinishPickingMediaWithInfo:(NSDictionary *)info{


NSLog(@"Picker returned successfully.");

NSLog(@"%@", info);


NSString *mediaType = [info objectForKey:

UIImagePickerControllerMediaType];


if ([mediaType isEqualToString:(__bridge NSString *)kUTTypeMovie]){


NSURL *urlOfVideo =

[info objectForKey: UIImagePickerControllerMediaURL];

NSLog(@"Video URL = %@", urlOfVideo);


}


Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже