La API ha cambiado las reglas un poco y no te dan acceso al sistema de archivos directamente a la biblioteca de iPhoto cualquier Más. En cambio, obtienes URL de biblioteca de recursos como esta.
assets-library://asset/asset.JPG?id=1000000003&ext=JPG
se utiliza el objeto ALAssetLibrary para acceder al objeto ALAsset través de la URL.
por lo que desde la documentación para ALAssetLibrary tirar esto en un encabezado (o su fuente)
typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);
que tampoco estrictamente necesario, pero mantiene las cosas bastante.
y luego en su fuente.
-(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 par de cosas a tener en cuenta son que este utiliza bloques que eran nuevas para mí antes de comenzar mi iOS4 portar pero es posible que gusta mirar a
https://www.mikeash.com/pyblog/friday-qa-2008-12-26.html
y
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
Inclinan un poco la cabeza, pero si los considera selectores de notificaciones o devoluciones de llamada tipo de ayuda.
también
- cuando
findLargeImage
devuelve el resultblock suele haber corrido sin embargo, como su una devolución de llamada. Tan grandeImagen no será válido todavía.
largeImage
debe ser una variable de instancia que no tenga el alcance del método .
Utilizo este constructo para hacer esto cuando uso el método, pero puede encontrar algo más adecuado para su uso.
[node.view findLargeImage];
UIImage *thumb = node.view.largeImage;
if (thumb) { blah blah }
Eso es lo que aprendí al intentar hacer que esto funcionara de todos modos.
iOS 5 de actualización
Cuando se dispara el bloque resultado parece ser un poco más lento con IOS5 & dispositivos de núcleo tal vez solo por lo que no podía confiar en que la imagen sea directamente después de llamar findLargeImage
. Así que lo cambié para llamar a un delegado.
@protocol HiresImageDelegate <NSObject>
@optional
-(void)hiresImageAvailable:(UIImage *)aimage;
@end
y comme ça
//
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
UIImage *largeimage = [UIImage imageWithCGImage:iref];
[delegate hiresImageAvailable:large];
}
};
me di cuenta de una manera de hacerlo: \t ALAssetRepresentation * assetRep = [defaultRepresentation activo]; UIImage * image = [UIImage imageWithCGImage: [assetRep fullResolutionImage]]; Pero quiero acceder a él a través de una URL. ayuda ... – Bangdel