目前我正在通过以下方式将SDWebImage集成到我的项目中
1)#import“UIButton + WebCache.h”
2)[button setImageWithURL:url placeholderImage:[UIImage imageNamed:@“no_photo.png”]];
因此,它将在相应按钮上方显示URL中显示的图像列表。
但是现在我想在下载图片时在按钮上方显示一个活动指示器,那我该怎么办呢?
答案 0 :(得分:46)
对我来说就像一个魅力:
斯威夫特3:
imgView.setShowActivityIndicator(true)
imgView.setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
Swift 4 :(编辑:更新)
imgView.sd_setShowActivityIndicatorView(true)
imgView.sd_setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
斯威夫特5:
imgView.sd_imageIndicator = SDWebImageActivityIndicator.gray
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
答案 1 :(得分:4)
您可以下载UIActivityIndicator-for-SDWebImage,这是向您的SDWebImage视图添加UIActivityView的最简单方法。使用CocoaPods,只需将此行添加到podfile:
pod 'UIActivityIndicator-for-SDWebImage'
您可以根据自己的喜好使用其中一行:
- (void)setImageWithURL:(NSURL *)url usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
只需导入
#import <UIActivityIndicator-for-SDWebImage/UIImageView+UIActivityIndicatorForSDWebImage.h>
并使用此代码
[imageView setImageWithURL:[NSURL URLWithString:@"https://media.licdn.com/mpr/mpr/wc_200_200/p/1/005/07f/0a3/30cb8dd.jpg"] placeholderImage:[UIImage imageNamed:@"myImage.jpg"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
答案 2 :(得分:3)
我发现这样做的最好方法是使用SDWebImageManager类。然后,您的视图控制器或其他类将需要符合SDWebImageManagerDelegate协议。
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImage *cachedImage = [manager imageWithURL:url];
if (cachedImage) {
[button setImage:cachedImage];
// stop or remove your UIActivityIndicatorView here
}
else {
[manager downloadWithURL:url delegate:self];
}
下载图像后,将调用委托方法:
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {
[button setImage:image];
// stop or remove your UIActivityIndicatorView here
}
下载图像时出现错误还有一种委托方法
- (void)webImageManager:(SDWebImageManager *)imageManager didFailWithError:(NSError *)error {
// Handle error here
}
如果您有多个按钮,则可能无法在下载图像后确定哪个图像属于哪个按钮。在这种情况下,您可能需要一个按钮子类来处理上面的下载,然后更新自己的图像。
希望有所帮助。
答案 3 :(得分:3)
最好的方法是在UIImageView + WebCache.m中的所有“setImage”函数中添加activityIndicator,然后在“webImageManager:r didFinishWithImage:”中删除它,我在设备中测试它并且它工作顺利,她是一个例如:
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
{
UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleWhiteLarge)];
[activity startAnimating];
[activity setCenter:self.center];
[self addSubview:activity];
[activity release];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImage *cachedImage = [manager imageWithURL:url];
if (cachedImage)
{
// the image is cached -> remove activityIndicator from view
for (UIView *v in [self subviews])
{
if ([v isKindOfClass:[UIActivityIndicatorView class]])
{
[activity removeFromSuperview];
}
}
}
[self setImageWithURL:url placeholderImage:placeholder options:0];
}
然后用淡入淡出动画删除它;):
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image
{
for (UIView *v in [self subviews])
{
if ([v isKindOfClass:[UIActivityIndicatorView class]])
{
// NSLog(@"-didFinishWithImage-");
[((UIActivityIndicatorView*)v) stopAnimating];
[v removeFromSuperview];
}
}
[UIView beginAnimations:@"fadeAnimation" context:NULL];
[UIView setAnimationDuration:0.9];
self.alpha = 0;
self.image = image;
self.alpha=1;
//[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self cache:YES];
[UIView commitAnimations];
}
答案 4 :(得分:3)
快速5
//pass true for showing indicator View
self.imageView.sd_setShowActivityIndicatorView(true)
//give style value
self.imageView.sd_setIndicatorStyle(UIActivityIndicatorView.Style.gray)
//Set your image as you are want to do
self.imageView.sd_setImage(with: URL(string: self.imageUrl), placeholderImage: UIImage())
答案 5 :(得分:1)
对于 Swift 5 用户可以这样使用 SDWebImageManager
extension UIImageView {
func getImage(url: String, placeholderImage: UIImage?, success:@escaping (_ _result : Any? ) -> Void, failer:@escaping (_ _result : Any? ) -> Void) {
self.sd_imageIndicator = SDWebImageActivityIndicator.gray
self.sd_setImage(with: URL(string: url), placeholderImage: placeholderImage, options: SDWebImageOptions(rawValue: 0), completed: { image, error, cacheType, imageURL in
// your rest code
if error == nil {
self.image = image
success(true)
}else {
failer(false)
}
})
}
}
用法:-
var imageFeatureImage: String = ""
if !imageURL.contains("https://") {
imageFeatureImage = BASE_URL_IMAGE+imageURL
}
yourimageView.getImage(url: (imageFeatureImage), placeholderImage: nil) { (success) in
yourimageView.contentMode = .scaleAspectFill
} failer: { (failed) in
yourimageView.image = UIImage.init(named: "placeholder")
yourimageView.contentMode = .scaleAspectFit
}
答案 6 :(得分:0)
Objective-C:SDWebImage(5.x.x)
[imgView setSd_imageIndicator:SDWebImageActivityIndicator.grayIndicator];
[imgView sd_setImageWithURL:[NSURL URLWithString: urlString] placeholderImage:nil];