L'API a changé les règles légèrement et vous n'obtenez pas directement accès au système de fichiers de la bibliothèque iPhoto. Au lieu de cela, vous obtenez de l'actif de la bibliothèque de l'URL comme ceci.
assets-library://asset/asset.JPG?id=1000000003&ext=JPG
Vous utilisez le ALAssetLibrary objet pour accéder à la ALAsset de l'objet via l'URL.
donc, à partir de la documentation pour ALAssetLibrary jeter ce dans un en-tête (ou source)
typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);
ce qui n'est pas strictement nécessaire, mais garde les choses assez.
et puis dans votre source.
-(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];
}
}
Un couple de choses à noter que cette utilise des blocs qui étaient nouveaux pour moi avant j'ai commencé mon iOS4 portage, mais vous pourriez aimer regarder
http://www.mikeash.com/pyblog/friday-qa-2008-12-26.html
et
http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
Ils plier votre tête un peu, mais si vous pensez à eux aussi de notification de sélecteurs, ou des rappels de ce genre d'aide.
Aussi
- lors de l'
findLargeImage
renvoie la
resultblock ont l'habitude d'exécuter encore comme sa
un rappel. Donc largeImage ne sera pas
encore valide.
-
largeImage
doit être un
variable d'instance sont pas limitées à l'
la méthode.
J'ai utiliser cette construction pour ce faire, lors de l'utilisation de la méthode, mais vous pouvez trouver quelque chose de plus adapté à votre utilisation.
[node.view findLargeImage];
UIImage *thumb = node.view.largeImage;
if (thumb) { blah blah }
C'est ce que j'ai appris en essayant de le faire fonctionner de toute façon.
iOS 5 mise à jour
Lorsque le résultat du bloc feux semble être un peu plus lent avec iOS5 et peut-être unique de base des appareils donc je ne pourrais pas compter sur l'image pour être disponible directement après l'appel de findLargeImage
. Alors je l'ai changé à faire appel à un délégué.
@protocol HiresImageDelegate <NSObject>
@optional
-(void)hiresImageAvailable:(UIImage *)aimage;
@end
et comme cá
//
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
UIImage *largeimage = [UIImage imageWithCGImage:iref];
[delegate hiresImageAvailable:large];
}
};