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


120

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

Ответы:


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];
    }

3
Спасибо @Schrockwell, я еще больше улучшил его, используя синхронизированные блоки - я видел состояние гонки, когда активность не уменьшалась должным образом.
Resh32

3
Хороший пример того, как простые вещи делать сложно)
fnc12

19

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

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

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];
});

0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.