Я заметил, что некоторые приложения, такие как Safari и Mail, показывают индикатор загрузки в строке состояния (панель на самой верхней части телефона), когда они обращаются к сети. Есть ли способ сделать то же самое в приложениях SDK, или это только Apple?
Как показать индикатор загрузки в верхней строке состояния
Ответ 1
Это в UIApplication:
Для цели C:
Начало:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
End:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
Для быстрого:
Начать
UIApplication.shared.isNetworkActivityIndicatorVisible = true
End
UIApplication.shared.isNetworkActivityIndicatorVisible = false
Ответ 2
Я нашел следующие макросы довольно полезными!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
Таким образом, вы можете просто вызвать ShowNetworkActivityIndicator();
или HideNetworkActivityIndicator();
из вашего приложения (пока, конечно, заголовок включен!).
Ответ 3
Я написал синглтон, который решает проблему множественных подключений, сохраняя счетчик того, что происходит (чтобы не удалять статус при возврате соединения, а другой еще активен):
Файл заголовка:
#import <Foundation/Foundation.h>
@interface RMActivityIndicator : NSObject
-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;
+(RMActivityIndicator *)sharedManager;
@end
и реализация:
#import "RMActivityIndicator.h"
@interface RMActivityIndicator ()
@property(nonatomic,assign) unsigned int activityCounter;
@end
@implementation RMActivityIndicator
- (id)init
{
self = [super init];
if (self) {
self.activityCounter = 0;
}
return self;
}
-(void)increaseActivity{
@synchronized(self) {
self.activityCounter++;
}
[self updateActivity];
}
-(void)decreaseActivity{
@synchronized(self) {
if (self.activityCounter>0) self.activityCounter--;
}
[self updateActivity];
}
-(void)noActivity{
self.activityCounter = 0;
[self updateActivity];
}
-(void)updateActivity{
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = (self.activityCounter>0);
}
#pragma mark -
#pragma mark Singleton instance
+(RMActivityIndicator *)sharedManager {
static dispatch_once_t pred;
static RMActivityIndicator *shared = nil;
dispatch_once(&pred, ^{
shared = [[RMActivityIndicator alloc] init];
});
return shared;
}
@end
Пример:
[[RMActivityIndicator sharedManager]increaseActivity];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
[[RMActivityIndicator sharedManager]decreaseActivity];
}
Ответ 4
Для этого используется один строковый код:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Ответ 5
Вам необходимо позаботиться о том, чтобы скрыть индикатор активности и после завершения сетевого вызова.
Если вы используете AFNetworking
, вам не нужно много делать.
Сделайте следующие изменения в AppDelegate
Класс:
-
Импорт
AFNetworking/AFNetworkActivityIndicatorManager.h
-
Поместите это в
didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Ответ 6
Также может быть полезно убедиться, что вы используете его в основном потоке, поскольку он связан с пользовательским интерфейсом.
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
Ответ 7
Индикатор активности сети в строке состояния устарел в iOS 13.
Использование UIApplication.shared.isNetworkActivityIndicatorVisible = true
больше не будет работать.
Сообщение об устаревании говорит:
При необходимости предоставьте пользовательский интерфейс сетевой активности в своем приложении.
Ответ 8
Как уже говорили многие, для iPhone X и, вероятно, для других новых айфонов с надписью нет индикатора сетевой активности.
Я натолкнулся на эту невероятную библиотеку, написанную Ортвином Генцем, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator
Он помещает индикатор обратно туда, где он был, когда iPhone X был первоначально выпущен, многие помнят тип индикатора Knight Rider.
Эта библиотека доступна для Swift 4.2, поэтому вам нужно будет изменить настройки языка Swift, как описано здесь: Тип "NSAttributedStringKey" (он же "NSString") не имеет члена "font"