2012-08-08 15 views
7

He estado usando SDWebImage en mi aplicación de iPhone para manejar toda la carga de imágenes. Estoy usando una imagen de marcador de posición, y quiero fundir o fundir en la nueva imagen una vez que se carga. Estoy usando un bloque de éxito para establecer la imagen, y está funcionando muy bien. Sin importar lo que intento, la imagen no se desvanecerá. Intenté enviar el código de la animación al hilo principal, pero tampoco ayudó. Simplemente carga al instante ... Sin animación.iOS SDWebImage fade in new image

Aquí está mi código. ¿Alguna idea?

// load placeholder image 
NSURL *url = ... 
_imageView = [[UIImageView alloc] init]; 
[_imageView setImage:[UIImage imageNamed:@"loading.jpg"]]; 

// request image 
SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
[manager downloadWithURL:url 
       delegate:self 
       options:0 
       success:^(UIImage *image) { 

        [UIView transitionWithView:_imageView 
             duration:3.0 
             options:UIViewAnimationOptionTransitionCrossDissolve 
            animations:^{ 
             [_imageView setImage:image]; 
            } completion:NULL]; 

} 
failure:nil]; 

Respuesta

19

Se podría establecer el imageView.alpha a 0 justo antes de que el bloque de animación, a continuación, en el bloque de animación tiene que animar de nuevo a imageView.alpha = 1,0;

// load placeholder image 
NSURL *url = ... 
_imageView = [[UIImageView alloc] init]; 
[_imageView setImage:[UIImage imageNamed:@"loading.jpg"]]; 

// request image 
SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
[manager downloadWithURL:url 
      delegate:self 
      options:0 
      success:^(UIImage *image, BOOL cached) { 

        imageView.alpha = 0.0; 
       [UIView transitionWithView:_imageView 
            duration:3.0 
            options:UIViewAnimationOptionTransitionCrossDissolve 
           animations:^{ 
            [_imageView setImage:image]; 
             imageView.alpha = 1.0; 
           } completion:NULL]; 

} 
failure:nil]; 
+0

funcionó muy bien. ¡Gracias! – nothappybob

+0

genial, funcionó como un amuleto –

1

SWIFT:

func setSDWebImageWithAnimation(imageViewToSet mImageView:UIImageView, URLToSet imageURL:NSURL!) 
    { 
     mImageView.image = UIImage(named: "favouritePlaceholder") 
     SDWebImageManager.sharedManager().downloadImageWithURL(imageURL, options: nil, progress: nil) { (downloadedImage:UIImage!, error:NSError!, cacheType:SDImageCacheType, isDownloaded:Bool, withURL:NSURL!) -> Void in 
      mImageView.alpha = 0 
      UIView.transitionWithView(mImageView, duration: 1.0, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {() -> Void in 
       mImageView.image = downloadedImage 
       mImageView.alpha = 1 
       }, completion: nil) 

     } 
    } 
+0

Esta solución no intenta cargar la imagen desde el caché. Va a volver a descargar cada imagen una y otra vez. –

7

para SWIFT, he creado esta extensión. Solo se desvanece, cuando la imagen en realidad tuvo que ser descargada de la web. Si se sirvió desde la memoria caché, entonces no se desvanecerá.

import UIKit 
import SDWebImage 

extension UIImageView { 

    public func sd_setImageWithURLWithFade(url: NSURL!, placeholderImage placeholder: UIImage!) 
    {  self.sd_setImageWithURL(url, placeholderImage: placeholder) { (image, error, cacheType, url) -> Void in 

     if let downLoadedImage = image 
     { 
      if cacheType == .None 
      { 
       self.alpha = 0 
       UIView.transitionWithView(self, duration: 0.2, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {() -> Void in 
        self.image = downLoadedImage 
        self.alpha = 1 
        }, completion: nil) 

      } 
     } 
     else 
     { 
      self.image = placeholder 
     } 
     } 
    } 
} 
0

Este código de extensión funcionó mejor para mí.

extension UIImageView { 
    public func setImageWithFadeFromURL(url: NSURL, placeholderImage placeholder: UIImage? = nil, animationDuration: Double = 0.3) { 
    self.sd_setImageWithURL(url, placeholderImage: placeholder) { (fetchedImage, error, cacheType, url) in 
     if error != nil { 
      print("Error loading Image from URL: \(url)\n(error?.localizedDescription)") 
     } 

     self.alpha = 0 
     self.image = fetchedImage 
     UIView.transitionWithView(self, duration: (cacheType == .None ? animationDuration : 0), options: .TransitionCrossDissolve, animations: {() -> Void in 
      self.alpha = 1 
     }, completion: nil) 
    } 
    } 

    public func cancelImageLoad() { 
    self.sd_cancelCurrentImageLoad() 
    } 
} 
0

Pruebe esto:

[self.myImage sd_setImageWithURL:storyThumbnailURL placeholderImage:[UIImage imageNamed:@"xyz"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
    if (cacheType == SDImageCacheTypeNone) { 
     self.myImage.alpha = 0; 
     [UIView animateWithDuration:0.3 animations:^{ 
      self.myImage.alpha = 1; 
     }]; 
    } else { 
     self.myImage.alpha = 1; 
    } 
}];