Как показать индикатор загрузки в верхней строке состояния

120

Я заметил, что некоторые приложения, такие как Safari и Mail, показывают индикатор загрузки в строке состояния (полоса в самом верху телефона), когда они получают доступ к сети. Есть ли способ сделать то же самое в приложениях SDK, или это только Apple?

rustyshelf
источник

Ответы:

213

Это в UIApplication:

Для цели C:

Начало:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Конец:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Для быстрого:

Начало

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Конец

UIApplication.shared.isNetworkActivityIndicatorVisible = false
Стивен Дарлингтон
источник
1
Спасибо, что отлично работает. Небольшое замечание: симулятор, похоже, игнорирует это значение, что заставило меня сначала подумать, что это не сработало.
rustyshelf 03
11
@rustyshelf, он отображается в новых симуляторах.
MrHus
2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// как один лайнер
Дэвид Дуглас
1
Для использования синтаксиса SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre
2
Индикатор активности не будет отображаться в строке состояния на iPhone X
Melly
30

Я нашел следующие макросы очень полезными!

#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO

Таким образом, вы можете просто позвонить ShowNetworkActivityIndicator();или HideNetworkActivityIndicator();из своего приложения (если, конечно, есть заголовок!).

Майкл водопад
источник
35
Почему бы не определить категорию в UIApplication? Кажется, намного лучше (и легче отлаживать), чем #define.
Barry Wark
25

Я написал синглтон, который решает проблему нескольких подключений, сохраняя счетчик того, что происходит (чтобы избежать удаления статуса, когда соединение возвращается, но другое все еще активно):

Заголовочный файл:

#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];
    }
Resh32
источник
3
Спасибо @Schrockwell, я еще больше улучшил его, используя синхронизированные блоки - я видел состояние гонки, когда активность не уменьшалась должным образом.
Resh32
3
Хороший пример того, как простые вещи делать сложно)
fnc12
19

Однострочный код для этого:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
asish
источник
5

Вам нужно позаботиться о том, чтобы скрыть индикатор активности также после выполнения сетевого вызова.

Если пользуетесь AFNetworking, то много делать не нужно.

Сделайте следующие изменения в AppDelegateклассе:

  1. Импортировать AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Поместите это в didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

Бабу Лал
источник
1
Или с ресткитом это будет #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
deepwinter
4

Индикатор сетевой активности в строке состояния устарел в iOS 13 .

Использование UIApplication.shared.isNetworkActivityIndicatorVisible = trueбольше не будет работать.

В сообщении об устаревании говорится:

При необходимости предоставьте пользовательский интерфейс сетевой активности в своем приложении.

М Реза Ф
источник
2

Также может быть полезно убедиться, что вы запускаете его в основном потоке, поскольку он связан с пользовательским интерфейсом.

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
Sev
источник
0

Как многие уже говорили, у iPhone X нет индикатора сетевой активности и, вероятно, у других новых iPhone с выемкой.

Я наткнулся на эту невероятную библиотеку, написанную Ортвином Генцем, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Он возвращает индикатор туда, где он был при первоначальном выпуске iPhone X. Многие помнят индикатор типа Knight Rider.

Эта библиотека доступна для Swift 4.2, поэтому вам нужно будет изменить настройки языка Swift, как описано здесь: Тип «NSAttributedStringKey» (он же «NSString») не имеет элемента «font»

erickva
источник