Я помітив, що деякі додатки, такі як Safari та Mail, показують індикатор завантаження в рядку стану (панелі в самому верху телефону), коли вони звертаються до мережі. Чи можна зробити те ж саме у програмах SDK, чи це лише Apple?
Я помітив, що деякі додатки, такі як Safari та Mail, показують індикатор завантаження в рядку стану (панелі в самому верху телефону), коли вони звертаються до мережі. Чи можна зробити те ж саме у програмах SDK, чи це лише Apple?
Відповіді:
Це в застосуванні UIA:
Для цілі C:
Початок:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
Кінець:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
Для швидкого:
Початок
UIApplication.shared.isNetworkActivityIndicatorVisible = true
Кінець
UIApplication.shared.isNetworkActivityIndicatorVisible = false
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
// як один лайнер
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
Наступні макроси я знайшов досить корисними!
#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
Таким чином, ви можете просто зателефонувати ShowNetworkActivityIndicator();
або HideNetworkActivityIndicator();
зсередини програми (доки, звичайно, включений заголовок!).
Я написав синглтон, який вирішує проблему декількох з'єднань, зберігаючи лічильник того, що відбувається (щоб уникнути видалення стану, коли з'єднання повертається, але інше все ще активне):
Файл заголовка:
#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];
}
Вам потрібно подбати про приховування показника активності також після того, як буде здійснено ваш мережевий дзвінок.
Якщо ви користуєтеся AFNetworking
, то вам не потрібно робити багато.
Виконайте такі зміни в AppDelegate
класі:
Імпорт AFNetworking/AFNetworkActivityIndicatorManager.h
Покладіть це didFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
Як багато хто говорив, для iPhone X і, ймовірно, для інших нових iPhone з індичкою немає індикатора мережевої активності.
Я натрапив на цю неймовірну бібліотеку, написану Ортвіном Генцем, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator
Він повертає індикатор туди, де він був, коли iPhone X спочатку був випущений, багато хто пам’ятатиме тип індикатора Knight Rider.
Ця бібліотека доступна для Swift 4.2, тому вам потрібно буде змінити налаштування мови Swift, як описано тут: Введіть 'NSAttributedStringKey' (він же 'NSString') не має членського шрифту '