Я заметил, что NSDictionary, возвращаемый UIImagePicker для Camera Roll, похоже, больше не возвращает объект UIImagePickerControllerOriginalImage. Вместо этого я получаю UIImageControllerReferenceURL, требуя от меня использовать assetForURL ALAAssetLibrary для создания UIImage через длинный и сложный процесс.
В сети достаточно примеров этого, все они удивительно похожи, которые я реализовал, но после создания объекта ALARepresentation вызов любого из его методов вызывает исключение EXC_BAD_ACCESS, поэтому я не могу получить изображение. Кто-нибудь знает способ вернуть «исходное изображение», а не «ссылочный URL-адрес», или это поведение молча устарело?
ПРИМЕЧАНИЕ: я работаю под iOS 5 (потому что мне нравится управление памятью) и Xcode 4.2 для функции раскадровки. Возвращение к более ранним версиям кажется невозможным. Код выглядит так:
// in the header
#import <AssetsLibrary/AssetsLibtrary.h>
typedef void (^ALAAssetsLibraryAssetForURLReferenceBlock)(ALAAsset *asset);
typedef void (^AlAAssetsLibraryAccessForFailureBlock)(NSError *error);
// in the implementation
-(void) ImagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if (mediaType isEqualToString:(NSString*)kUTTypeImage]) {
NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
if (url) {
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
UIImage *image = [UIImage imageWithCGImage:iref];
[self displayImage:image];
}
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) {
// handle error
};
ALAssetsLibrary *assetsLib = [[ALAssetLibrary alloc]init];
[assetsLib assetForURL:url resultBlock:resultblock failureBlock:failureblock];
}
}
}
EXC_BAD_ACCESS происходит в строке, пытающейся создать CGImageRef. Я пробовал другие * rep методы (включая метаданные); они также бросают исключение. Единственное, что «работает» - это получение эскиза CGImageRef из ресурса, но мне нужно изображение с полным разрешением.
Наконец, даже если это сработало, асинхронная природа (с использованием блоков обратного вызова) не совсем то, что я хочу, так как это усложняет процесс выбора без конца в моем случае. Есть ли другой способ выбрать изображение с камеры?