Я лично считаю, что это нормально для функции возврата кортежа или None. Однако функция должна возвращать не более двух разных типов, а вторая должна быть None. Функция никогда не должна возвращать строку и список, например.
Работает как прелесть для меня:
Swift 3:
imgView.setShowActivityIndicator(true)
imgView.setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
Swift 4: (Edit: Updates)
imgView.sd_setShowActivityIndicatorView(true)
imgView.sd_setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
Вы можете скачать UIActivityIndicator-for-SDWebImage , что является самым простым способом добавить UIActivityView в ваш просмотр SDWebImage . Используя CocoaPods, просто добавьте эту строку в свой файл:
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];
лучший способ - добавить ActivityIndicator во все функции setImage в UIImageView + WebCache.m, после чего вы удалите его в «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];
}
, и вы удаляете его с анимацией fade;):
- (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];
}
Лучшим способом, который я нашел для этого, является использование класса 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
}
Если у вас несколько кнопок, у вас могут возникнуть проблемы с определением того, какое изображение принадлежит к какой кнопке после загрузки изображения. В этом случае вам может потребоваться подклассом кнопок, который обрабатывает загрузку, как описано выше, а затем обновляет собственное изображение.
Надеюсь, что это поможет.