2012-08-08 15 views
7

Ho utilizzato SDWebImage sulla mia app per iPhone per gestire tutto il caricamento dell'immagine. Sto usando un'immagine segnaposto e voglio dissolvenza incrociata o dissolvenza nella nuova immagine una volta caricata. Sto usando un blocco di successo per impostare l'immagine, e sta funzionando alla grande. Non importa quello che provo, l'immagine non svanirà però. Ho provato a inviare il codice dell'animazione al thread principale, ma non è stato di alcun aiuto. Carica solo istantaneamente ... Nessuna animazione.iOS SDWebImage fade in new image

Ecco il mio codice. qualche 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]; 

risposta

19

È possibile impostare l'imageView.alpha a 0 a destra prima del blocco di animazione, quindi nel blocco di animazione l'hanno animare di nuovo 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

funzionava. Grazie! – nothappybob

+0

ottimo questo ha funzionato come un fascino –

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

Questa soluzione non sta provando a caricare l'immagine dalla cache. Sta per scaricare nuovamente ogni immagine più e più volte. –

7

Per SWIFT, ho creato questa estensione. Si dissolve solo quando l'immagine deve essere effettivamente scaricata dal web. Se è stato servito dalla cache, allora non svanirà.

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

Questo codice di estensione ha funzionato meglio per me.

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

Prova questo:

[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; 
    } 
}];