2012-08-08 13 views
7

Ich habe SDWebImage in meiner iPhone App verwendet, um alle Bilder zu laden. Ich verwende ein Platzhalterbild und möchte das neue Bild nach dem Laden überblenden oder einblenden. Ich verwende einen Erfolgsblock, um das Bild einzustellen, und es funktioniert großartig. Egal was ich versuche, das Bild wird nicht eingeblendet. Ich habe versucht, den Animationscode zurück zum Hauptthread zu senden, aber das half auch nicht. Es lädt nur sofort ... Keine Animation.iOS SDWebImage neues Bild einblenden

Hier ist mein Code. Irgendwelche Gedanken?

// 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]; 

Antwort

19

Sie konnten die imageView.alpha auf 0 unmittelbar vor dem Animationsblock gesetzt ist, dann in der Animation-Block haben, es zu imageView.alpha animieren zurück = 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

Arbeitete groß. Vielen Dank! – nothappybob

+0

toll funktioniert das wie ein Charme –

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

Diese Lösung versucht nicht, das Bild aus dem Cache zu laden. Es wird jedes Bild immer wieder neu herunterladen. –

7

Für SWIFT, habe ich diese Erweiterung. Es blendet nur ein, wenn das Bild tatsächlich aus dem Internet heruntergeladen werden musste. Wenn es aus dem Cache bereitgestellt wurde, wird es nicht verblassen.

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

Dieser Erweiterungscode funktionierte besser für mich.

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

Probieren Sie dies:

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