iOS SDWebImage fade in new image

て烟熏妆下的殇ゞ 提交于 2019-12-02 17:19:42
nicholjs

You could set the imageView.alpha to 0 right before the animation block, then in the animation block have it animate back to 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];

For SWIFT, i created this extension. It only fades in, when the image actually had to be downloaded from the web. If it was served from the cache, then it won't fade.

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
        }
        }
    }
}

SDWebImage now offers a built-in fade transition as of 4.3.0.

imageView.sd_imageTransition = SDWebImageTransition.fadeTransition;
imageView.sd_setImage(with: ...)

See the documentation here, you can perform more complex transitions using their API.

https://github.com/rs/SDWebImage/wiki/Advanced-Usage#image-transition-430

Here is the code which help me out and working great.

photoImageView.sd_imageTransition = .fade
photoImageView.sd_setImage(with: URL(string: imageUrl), completed: nil)

This is Swift 4 version of @Zoltan Varadi answer:

extension UIImageView {
    public func sd_setImageWithURLWithFade(url: URL!, placeholderImage placeholder: UIImage!) {
        self.sd_setImage(with: url, placeholderImage: placeholder) { (image, error, cacheType, url) -> Void in
            if let downLoadedImage = image {
                if cacheType == .none {
                    self.alpha = 0
                    UIView.transition(with: self, duration: 0.3, options: UIViewAnimationOptions.transitionCrossDissolve, animations: { () -> Void in
                        self.image = downLoadedImage
                        self.alpha = 1
                    }, completion: nil)   
                }
            } else {
                self.image = placeholder
            }
        }
    }
}

I changed the duration to 0.3

You can add this function to the extension in order you need the completionHandler block:

public func sd_setImageWithURLWithFade(url: URL!, placeholderImage placeholder: UIImage!, comple: @escaping (Bool)->()) {
    self.sd_setImage(with: url, placeholderImage: placeholder, options: .allowInvalidSSLCertificates) { (image, error, cacheType, url) in
        if let downLoadedImage = image {
            if cacheType == .none {
                self.alpha = 0
                UIView.transition(with: self, duration: 0.3, options: UIViewAnimationOptions.transitionCrossDissolve, animations: { () -> Void in
                    self.image = downLoadedImage
                    self.alpha = 1
                }, completion: { _ in
                    comple(true)
                })
            }
        } else {
            self.image = placeholder
        }
    }
}

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)

        }
    }

Try out this:

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

This extension code worked better for 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()
  }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!