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