我正在使用SDWebView图像,我想显示一个活动指示器作为占位符,同时从远程获取图像。
我在这里尝试过Malek的答案How to show an activity indicator in SDWebImage,但似乎是这样
UIImage *cachedImage = [manager imageWithURL:url];
已弃用。
是否有人使用此库可以告诉我如何在加载图像时插入活动指示器?
编辑
根据Michael Frederick的指示,我最终得到了这段代码,一切正常。
UIActivityIndicatorView *activityIndicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
[activityIndicator startAnimating];
activityIndicator.center = CGPointMake(self.tipImage.frame.size.width /2, self.tipImage.frame.size.height/2);
[imageView setImageWithURL:[NSURL URLWithString:imageString]
placeholderImage:nil options:SDWebImageProgressiveDownload
success:^(UIImage *image) { [activityIndicator stopAnimating];[activityIndicator removeFromSuperview]; }
failure:^(NSError *error) { [activityIndicator stopAnimating];[activityIndicator removeFromSuperview]; }];
[imageView addSubview:activityIndicator];
但是,一般来说,你可以在不使用该分支的情况下轻松地完成它:
__block UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:activityStyle];
activityIndicator.center = imageView.center;
activityIndicator.hidesWhenStopped = YES;
[imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
success:^(UIImage *image) { [activityIndicator removeFromSuperview]; }
failure:^(NSError *error) { [activityIndicator removeFromSuperview]; }];
[imageView addSubview:activityIndicator];
[activityIndicator startAnimating];
针对Swift 2.0更新了解决方案,使用SDWebImage加载图像URL
[cell.dreamImageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",dream.thumbnail]] placeholderImage:[UIImage imageNamed:@"dream_bg_2.png"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
CGFloat domandeFloat = [[NSNumber numberWithInt: receivedSize] floatValue];
CGFloat corretteFloat = [[NSNumber numberWithInt: expectedSize] floatValue];
float currentProgress = domandeFloat/corretteFloat;
NSLog(@"progress %f",currentProgress);
cell.progressView.progress = currentProgress;
//[self.dreamsTableView reloadData];
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
cell.progressView.hidden = YES;
}];
SdWebImage 5.0
imageView.setShowActivityIndicatorView(true)
imageView.setIndicatorStyle(.White)
对于Swift 5.0和SDWebImage 5.0:
更换
YOUR_IMAGEVIEW.sd_imageIndicator = SDWebImageActivityIndicator.gray
通过
imageView.sd_setShowActivityIndicatorView(true)
imageView.sd_setIndicatorStyle(.gray)
根据CanÜrek的回答,您可能想要创建一个类别,以便在多个应用程序中更容易使用,而无需修改SDWebImage框架。
头文件:
imageView.sd_imageIndicator = SDWebImageActivityIndicator.gray
实施文件:
#import <UIKit/UIKit.h>
#import <SDWebImage/UIImageView+WebCache.h>
@interface UIImageView (WebCacheWithActivityIndicator)
- (void)setImageShowingActivityIndicatorWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock;
@end
希望它可以帮助你们
干杯
另一种解决方案是使用动画图像作为占位符图像:
#import "UIImageView+WebCacheWithActivityIndicator.h"
@implementation UIImageView (WebCacheWithActivityIndicator)
- (void)setImageShowingActivityIndicatorWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock
{
UIActivityIndicatorView* activityIndication = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[activityIndication setFrame:CGRectMake((self.frame.size.width - activityIndication.frame.size.width) / 2 , (self.frame.size.height - activityIndication.frame.size.height) / 2 , activityIndication.frame.size.width , activityIndication.frame.size.width)];
[self addSubview:activityIndication];
[activityIndication startAnimating];
[self setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
if(completedBlock)
{
completedBlock(image,error,cacheType);
}
[activityIndication stopAnimating];
[activityIndication removeFromSuperview];
}];
}
@end
随着更新的[UIImage animatedImageNamed:@"animated_placeholder" duration:1]
(iOS 8上的已解决崩溃),我们有以下方法 -
library
我们可以看到添加进度块和已完成块的选项,我们只需在进度块中添加活动指示器并在完成块中删除。
在此处添加活动指标的自定义方法 -
- (void)sd_setImageWithURL:(NSURL *)url
{
[self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
}
这将在正在下载图像时将UIActivityIndicatorView添加到UIImageView的中心,并在完成时删除。
当用户反复上下滚动列表时,我的列表相当滞后。我发现当重复调用cellForItemAtIndexPath时,activityindicator已被无限添加。
要解决此问题,请在activityindicator中添加标记:
- (void)sd_setImageWithURL:(NSURL *)url {
[self sd_setImageWithURL:url placeholderImage:nil options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
UIActivityIndicatorView *activity = nil;
activity = (UIActivityIndicatorView *)[self viewWithTag:100000];
if (!activity) {
activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[activity setTag:100000];
[activity setHidesWhenStopped:YES];
[activity setCenter:CGPointMake(self.frame.size.width/2.0f,self.frame.size.height/2.0f)];
[self addSubview:activity];
}
else {
[activity setCenter:CGPointMake(self.frame.size.width/2.0f,self.frame.size.height/2.0f)];
}
[activity startAnimating];
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
UIActivityIndicatorView *activity = (UIActivityIndicatorView *)[self viewWithTag:100000];
if ([activity isKindOfClass:[UIActivityIndicatorView class]]) {
[activity stopAnimating];
}
}];
}
在创建UIActivityIndicator之前,添加这些行以删除之前的activityindicator,然后再添加新的:
activityIndicator.tag = 9999;
注意:标记内容可以是不在单元格中使用的任何数字。
对我有用的最佳解决方案如下。在下载图像时显示进度指示器是美观且令人鼓舞的。我使用UIView* toDeleteLoader = [cell viewWithTag:9999];
if(toDeleteLoader != nil){
[toDeleteLoader removeFromSuperview];
}
作为圆形进度视图。你也可以尝试一下。
UICircularSlider
这里 [_imgPost sd_setImageWithURL:urlPost placeholderImage:zeroImage options:SDWebImageContinueInBackground progress:^(NSInteger receivedSize, NSInteger expectedSize)
{
CGFloat domandeFloat = [[NSNumber numberWithInteger: receivedSize] floatValue];
CGFloat corretteFloat = [[NSNumber numberWithInteger: expectedSize] floatValue];
float currentProgress = (domandeFloat/corretteFloat)*100;
NSLog(@"progress %.f%%",currentProgress);
DBG(@"%li, %li", receivedSize, expectedSize);
[_progress setValue:currentProgress];
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
[_progress setHidden:YES];
}];
是_progress
的一个例子
这是你如何做到的:
[imageView setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imageView setShowActivityIndicatorView:true];
[imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"defaultl_image"]];
那是我的解决方案。在该文件中:UIImageView + WebCache.m
找到那个方法并改变:
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
{
UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleGray)];
[activity startAnimating];
[activity setFrame:CGRectMake(self.frame.origin.x - 20, self.frame.origin.y - 10, self.frame.size.width, self.frame.size.height)];
[self addSubview:activity];
//[self setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
[self setImageWithURL:url
placeholderImage:placeholder
options:0
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)
{
[activity removeFromSuperview];
}];
}
你可以下载qazxsw poi,这是在你的UIActivityIndicator-for-SDWebImage视图中添加活动视图的最简单方法。使用CocoaPods,只需将此行添加到podfile:
SDWebImage
您可以根据自己的喜好使用以下其中一行:
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>
上面的代码有点不对。行'activityIndicator.center = imageView.center'没有为您提供正确的坐标以使进度视图居中。对我来说,它显示了细胞下方的指标。
注意 - 我使用的是最新版本的SDWebImage代码,因此方法略有不同。我也在使用UIButton作为imageView
试试这个:
[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];
我相信最新版本的sdwebimage这是一个更好的方法。
NSURL *url = [NSURL URLWithString:@"www.someimageurl.com"];
__block UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicator.frame = cell.imageView.bounds;
[cell.imageView addSubview:activityIndicator];
[activityIndicator startAnimating];
[cell.imageView setImageWithURL:url forState:UIControlStateNormal completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
[activityIndicator removeFromSuperview];
}];
注意:如果您没有属性设置,很明显self.activityindicator将无法正常工作。
我会用Michael Frederick的例子来创建activityindicator。
SDWebImage具有内置的活动指示器,可以完美地运行。试试这个:
斯威夫特3:
[self.customImageView setImageWithURL:imageURL
placeholderImage:nil
options:nil
progress:^(NSUInteger receivedSize, long long expectedSize) { [self.activityIndicator startAnimating]; }
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { [self.activityIndicator stopAnimating]; }];
与SWIFT 4中的上述代码相同:
imgView.setShowActivityIndicator(true)
imgView.setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
let activityIndicator = UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
activityIndicator.center = addImage.center
activityIndicator.hidesWhenStopped = true
addImage.sd_setImage(with: URL(string: feed.image), completed: { (image: UIImage?, error: Error?, cacheType: SDImageCacheType, imageURL: URL?) in
activityIndicator.removeFromSuperview()
})
addImage.addSubview(activityIndicator)
activityIndicator.startAnimating()