iOS SDWebImage исчезает в новом изображении

Я использую SDWebImage в своем приложении iPhone для обработки всей загрузки изображений. Я использую изображение-заполнитель, и я хочу пересечь или исчезнуть в новом изображении после его загрузки. Я использую блок успеха для установки изображения, и он отлично работает. Независимо от того, что я пытаюсь, изображение не исчезнет. Я попытался отправить код анимации обратно в основной поток, но это тоже не помогло. Он просто загружается мгновенно... Никакой анимации.

вот мой код. Любой мысли?

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

8 ответов


вы можете установить imageView.Альфа до 0 прямо перед блоком анимации, а затем в блоке анимации его анимировать обратно в 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];

для SWIFT я создал это расширение. Он исчезает только тогда, когда изображение действительно нужно было загрузить из интернета. Если он был подан из кэша, то он не исчезнет.

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

Свифт:

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)

        }
    }

попробуйте этот:

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

Это Swift 4 версия @Zoltan Varadi ответ:

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

Я изменил продолжительность на 0.3

вы можете добавить эту функцию в расширение, чтобы вам нужен блок completionHandler:

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

SDWebImage теперь предлагает встроенный переход затухания с 4.3.0.

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

см. документацию здесь, вы можете выполнять более сложные переходы, используя их API.

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


вот код, который помогает мне и отлично работает.

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

этот код расширения работал лучше для меня.

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