/* Отображаем элемент для выбора даты только после того, как вызывается
метод viewDidAppear:, что происходит при каждом отображении вида
нашего контроллера вида */
return;
} else {
beenHereBefore = YES;
}
if ([self isPhotoLibraryAvailable]){
UIImagePickerController *controller =
[[UIImagePickerController alloc] init];
controller.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];
if ([self canUserPickPhotosFromPhotoLibrary]){
[mediaTypes addObject:(__bridge NSString *)kUTTypeImage];
}
if ([self canUserPickVideosFromPhotoLibrary]){
[mediaTypes addObject:(__bridge NSString *)kUTTypeMovie];
}
controller.mediaTypes = mediaTypes;
controller.delegate = self;
[self.navigationController presentModalViewController: controller
animated: YES];
}
}
О том, как реализовать метод cameraSupportsMedia: sourceType:, который используется в этом примере, рассказано в разделе 13.1.
Обсуждение
Чтобы пользователь мог выбирать фотоснимки или видеоролики из своей библиотеки фотографий, необходимо установить свойство sourceType экземпляра UIImagePickerController в значение UIImagePickerControllerSourceTypePhotoLibrary и только потом открывать перед пользователем инструмент для выбора изображений. Кроме того, если вы хотите отфильтровать определенные фотографии или видеоролики из общего числа элементов, представленных пользователю в инструменте для выбора изображений, исключите значение kUTTypeMovie или kUTTypeImage соответственно из списка типов медийной информации, отображаемой в инструменте для выбора изображений (это делается в свойстве mediaTypes).
Учитывайте, что, если установить значение свойства mediaTypes контроллера для выбора изображений в nil, получится пустой массив, который спровоцирует ошибки времени исполнения.
После того как пользователь выберет желаемое изображение, вы будете получать обычные сообщения делегата, соответствующие протоколу UIImagePickerControllerDelegate. Подробнее о реализации методов, определяемых в этом протоколе для обработки изображений, рассказано в разделе 13.2.
См. также
Раздел 13.7.
13.7. Получение ресурсов из библиотеки ресурсов
Постановка задачи
Требуется получить фотографии или видео непосредственно из библиотеки фотографий, не прибегая к использованию каких-либо встроенных компонентов графического пользовательского интерфейса.
Решение
Воспользуйтесь фреймворком Assets Library (Библиотека ресурсов). Выполните следующие шаги.
1. Выделите и инициализируйте объект типа ALAssetsLibrary.
2. Передайте два блоковых объекта методу экземпляра enumerateGroupsWithTypes: usingBlock: failureBlock:, относящемуся к объекту «Библиотека ресурсов». Первый блок получит все группы, ассоциированные с типом, который мы сообщили этому методу. Группы будут относиться к типу ALAssetsGroup. В случае неудачи этой операции во втором блоке будет возвращена ошибка.
3. Воспользуйтесь методом экземпляра enumerateAssetsUsingBlock: каждого группового объекта для перечисления ресурсов, имеющихся в каждой группе. Этот метод принимает единственный параметр — блок, получающий информацию по отдельно взятому ресурсу. Блок, передаваемый в качестве параметра, должен принимать три параметра, первый из которых должен относиться к типу ALAsset.
4. Получив объекты ALAsset, доступные в каждой группе, вы можете затем найти различные свойства каждого ресурса: его тип, доступные URL и т. д. Для получения этих свойств примените метод экземпляра valueForProperty:, относящийся к каждому ресурсу типа ALAsset. Возвращаемое значение этого метода в зависимости от типа передаваемого ему параметра может представлять собой NSDictionary, NSString или любой другой тип объекта. Вскоре мы рассмотрим общие свойства, которые могут быть получены от любого ресурса.