Tengo una URL para una imagen (la obtuve de UIImagePickerController) pero ya no tengo la imagen en la memoria (la URL se guardó de una ejecución anterior de la aplicación). ¿Puedo volver a cargar el UIImage desde la URL?
Veo que UIImage tiene una imageWithContentsOfFile: pero tengo una URL. ¿Puedo usar dataWithContentsOfURL de NSData para leer la URL?
EDITAR1
basado en la respuesta de @ Daniel intenté el siguiente código pero no funciona ...
NSLog(@"%s %@", __PRETTY_FUNCTION__, photoURL);
if (photoURL) {
NSURL* aURL = [NSURL URLWithString:photoURL];
NSData* data = [[NSData alloc] initWithContentsOfURL:aURL];
self.photoImage = [UIImage imageWithData:data];
[data release];
}
Cuando lo ejecuté, la consola muestra:
-[PhotoBox willMoveToWindow:] file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG
*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0'
Mirando la pila de llamadas, llamo a URLWithString, que llama a URLWithString: relativeToURL :, luego initWithString: relativeToURL :, luego _CFStringIsLegalURLString, luego CFStringGetLength, luego forwarding_prep_0 , luego reenvío , luego - [NSObject doesNleReco.
¿Alguna idea de por qué mi NSString (la dirección de photoURL es 0x536fbe0) no responde a la longitud? ¿Por qué dice que no responde a [longitud NSURL]? ¿No sabe que param es un NSString, no un NSURL?
EDIT2
OK, el único problema con el código es la conversión de cadena a URL. Si codifico la cadena, todo lo demás funciona bien. Entonces, algo está mal con mi NSString y si no puedo resolverlo, supongo que debería ser una pregunta diferente. Con esta línea insertada (pegué la ruta desde el registro de la consola anterior), funciona bien:
photoURL = @"file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG";
fuente
Respuestas:
Puede hacerlo de esta manera (sincrónicamente, pero compacto):
Un enfoque mucho mejor es usar LazyTableImages de Apple para preservar la interactividad.
fuente
Puede probar SDWebImage , proporciona:
Ejemplo rápido:
fuente
UIImageView
.SDWebImage
También le permite llenar unUIImage
directamente usandoSDWebImageManager
- (void) downloadWithURL:...
. Vea su ejemplo en el archivo Léame.Y la versión rápida:
fuente
Si usted está realmente , absolutamente positivamente seguro de que el NSURL es una dirección de fichero, es decir,
[url isFileURL]
está garantizado para devolver cierto en su caso, a continuación, sólo tiene que utilizar:fuente
obtenga DLImageLoader e intente seguir el código
Otro ejemplo típico del mundo real del uso de DLImageLoader, que puede ayudar a alguien ...
Como mencioné anteriormente, otra gran biblioteca para considerar en estos días es Haneke (desafortunadamente no es tan liviana).
fuente
Pruebe este código, puede configurar la carga de la imagen con él, para que los usuarios sepan que su aplicación está cargando una imagen desde la URL:
fuente
Echa un vistazo a lo
AsyncImageView
provisto aquí . Algún buen código de ejemplo, e incluso podría ser utilizable "listo para usar" para usted.fuente
AFNetworking proporciona carga de imagen asíncrona en un UIImageView con soporte de marcador de posición. También admite redes asíncronas para trabajar con API en general.
fuente
Asegúrese de habilitar esta configuración desde iOS 9:
Configuración de seguridad de transporte de aplicaciones en Info.plist para garantizar la carga de la imagen desde la URL de modo que permita descargar la imagen y configurarla.
Y escribe este código:
fuente
La forma de usar una extensión Swift para
UIImageView
(código fuente aquí ):Crear propiedad calculada para asociados
UIActivityIndicatorView
Inicializador personalizado y Setter
fuente
La mejor y más fácil forma de cargar la imagen a través de la URL es mediante este código:
Reemplazar
imgUrl
por suImageURL
Reemplazar
imgView
por suUIImageView
.Cargará la imagen en otro subproceso, por lo que no ralentizará la carga de su aplicación.
fuente