- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
iOS. Приемы программирования - Вандад Нахавандипур
Шрифт:
Интервал:
Закладка:
} else {
NSLog(@"The camera does not support shooting videos.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Вот результаты запуска данного приложения на новом iPhone:
The front camera is available. // передняя камера доступна
The front camera is not equipped with a flash // передняя камера
// не оснащена функцией вспышки
The rear camera is available. // задняя камера доступна
The rear camera is equipped with a flash // задняя камера оснащена
, // функцией вспышки
The camera supports taking photos. // камера позволяет делать
, // фотоснимки
The camera supports shooting videos. // камера позволяет
// записывать видео
Вот вывод того же кода при запуске на симуляторе iPhone:
The front camera is not available. // передняя камера недоступна
The rear camera is not available. // задняя камера недоступна
The camera does not support taking photos // камера не поддерживает съемку фотографий
The camera does not support shooting videos // камера не поддерживает съемку видео
13.2. Фотографирование с помощью камеры
Постановка задачи
Требуется попросить пользователя сделать снимок (фотография выполняется камерой устройства). После того как пользователь сделает снимок, необходимо получить доступ к этой фотографии.
Решение
Инстанцируйте объект типа 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];
}
Обсуждение
При работе с делегатом инструмента для выбора изображений необходимо учитывать пару немаловажных аспектов. Два делегатных метода вызываются у объекта-делегата контроллера для выбора изображений. Метод imagePickerController: didFinishPickingMediaWithInfo: вызывается, когда пользователь завершает работу с инструментом выбора изображений (то есть делает снимок и наконец нажимает кнопку). В свою очередь, метод imagePickerControllerDidCancel: вызывается в случае, когда операция с инструментом выбора изображений отменяется.
Кроме того, метод делегата imagePickerController: didFinishPickingMediaWithInfo: содержит данные о том предмете, который был отснят пользователем, независимо от того, изображение это или видеоданные. Параметр didFinishPickingMediaWithInfo — это словарь значений, сообщающий, что именно было отснято в инструменте выбора изображений плюс метаданные отснятого контента и другую полезную информацию. Работу в этом методе следует начать со считывания значения ключа UIImagePickerControllerMediaType из этого словаря. Объект для данного ключа представляет собой экземпляр NSString и может принимать одно из следующих значений:
• kUTTypeImage — фотография, сделанная камерой;
• kUTTypeMovie — видеоролик, отснятый камерой.
Значения kUTTypeImage и kUTTypeMovie доступны во фреймворке Mobile Core Services и относятся к типу CFStringRef. При необходимости можно просто привести тип этих значений к NSString.
Определив тип ресурса, созданного камерой (то есть узнав, идет речь о фотографии или видеоролике), можно получить доступ к свойствам этого ресурса, вновь воспользовавшись параметром словаря didFinishPickingMediaWithInfo.
При работе с изображениями (kUTTypeImage) можно получить доступ к следующим ключам:
• UIImagePickerControllerMediaMetadata — объектом, хранимым по этому ключу, является объект типа NSDictionary. В этом словаре содержится масса полезной информации об изображении, отснятом пользователем. Подробное обсуждение значений, содержащихся в этом словаре, выходит за рамки этой главы;
• UIImagePickerControllerOriginalImage — объектом, хранимым по этому ключу, является объект типа UIImage. В нем содержится изображение, отснятое пользователем;
• UIImagePickerControllerCropRect — если вы активизировали возможность редактирования (с помощью свойства allowsEditing объекта UIImagePickerController), то в объекте этого ключа будет содержаться прямоугольник, по которому была сделана обрезка;
• UIImagePickerControllerEditedImage — если вы активизировали возможность редактирования (с помощью свойства allowsEditing объекта UIImagePickerController), то в значении этого ключа будет содержаться отредактированное изображение (масштабированное, с измененными размерами).
Для видеороликов (kUTTypeMovie), отснятых пользователем, можно получать доступ к ключу UIImagePickerControllerMediaURL в параметре словаря didFinishPickingMediaWithInfo в методе imagePickerController: didFinishPickingMediaWithInfo:. Значение этого ключа представляет собой объект типа NSURL, содержащий URL видеоролика, отснятого пользователем.
После того как вы получите ссылку на экземпляр UIImage, отснятый пользователем с помощью камеры, можете просто начинать использовать этот экземпляр в своем приложении.
Фотографии, снятые внутри приложения с помощью инструмента для выбора изображений, по умолчанию не сохраняются в каталоге для снимков фотокамеры (Camera Roll).

