API немного изменил правила, и вы больше не получаете прямого доступа файловой системы к библиотеке iPhoto.Вместо этого вы получаете URL библиотеки ресурсов, как это.
assets-library://asset/asset.JPG?id=1000000003&ext=JPG
Вы используете объект ALAssetLibrary для доступа к объекту ALAsset через URL.
, поэтому из документов для ALAssetLibrary добавьте это в заголовок (или ваш источник)
typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);
, который не является строго необходимым, но сохраняет вещи красивыми.
и затем в вашем источнике.
-(void)findLargeImage
{
NSString *mediaurl = [self.node valueForKey:kVMMediaURL];
//
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
largeimage = [UIImage imageWithCGImage:iref];
[largeimage retain];
}
};
//
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
};
if(mediaurl && [mediaurl length] && ![[mediaurl pathExtension] isEqualToString:AUDIO_EXTENSION])
{
[largeimage release];
NSURL *asseturl = [NSURL URLWithString:mediaurl];
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:asseturl
resultBlock:resultblock
failureBlock:failureblock];
}
}
Следует отметить, что здесь используются блоки, которые былиновичок до того, как я начал портировать iOS4, но вы можете посмотреть на
https://www.mikeash.com/pyblog/friday-qa-2008-12-26.html
и
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
Они сгибаютсянемного подумайте, но если вы думаете о них как о селекторах уведомлений или обратных вызовах, это как бы помогает.
Также
- , когда
findLargeImage
возвращает результат, блок еще не запустился как обратный вызов,Так что LargeImage еще не будет действительным. largeImage
должна быть переменной экземпляра, не относящейся к методу.
Я использую эту конструкцию, чтобы сделать это при использовании метода, но вы можете найти что-то более подходящее для вашегоиспользуйте.
[node.view findLargeImage];
UIImage *thumb = node.view.largeImage;
if (thumb) { blah blah }
Вот что я узнал, пытаясь заставить это работать в любом случае.
Обновление iOS 5
Когда срабатывает блок результатовбыть немного медленнее с iOS5 и, возможно, с одноядерными устройствами, поэтому я не мог полагаться на то, что изображение будет доступно сразу после вызова findLargeImage
.Поэтому я изменил его, чтобы вызвать делегата.
@protocol HiresImageDelegate <NSObject>
@optional
-(void)hiresImageAvailable:(UIImage *)aimage;
@end
и comme c
//
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
UIImage *largeimage = [UIImage imageWithCGImage:iref];
[delegate hiresImageAvailable:large];
}
};