Книга: iOS. Приемы программирования

Решение

Решение

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

#import «ViewController.h»
#import <MobileCoreServices/MobileCoreServices.h>
@interface ViewController ()<UIImagePickerControllerDelegate,
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);
}
else if ([mediaType isEqualToString:(__bridge NSString *)kUTTypeImage]){
/* Получим метаданные. Это касается
только изображений, но не видеороликов. */
NSDictionary *metadata =
[info objectForKey:
UIImagePickerControllerMediaMetadata];
UIImage *theImage =
[info objectForKey:
UIImagePickerControllerOriginalImage];
NSLog(@"Image Metadata = %@", metadata);
NSLog(@"Image = %@", theImage);
}
[picker dismissModalViewControllerAnimated: YES];
}
— (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
NSLog(@"Picker was cancelled");
[picker dismissModalViewControllerAnimated: YES];
}

Оглавление книги


Генерация: 0.087. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз