Jak wyświetlić wskaźnik załadunku na górnym pasku stanu

120

Zauważyłem, że niektóre aplikacje, takie jak Safari i Mail, pokazują wskaźnik ładowania na pasku stanu (pasek na samej górze telefonu), gdy uzyskują dostęp do sieci. Czy istnieje sposób na zrobienie tego samego w aplikacjach SDK, czy też jest to jedyna rzecz dla Apple?

rustyshelf
źródło

Odpowiedzi:

213

Jest w UIApplication:

W przypadku celu C:

Początek:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Koniec:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Dla szybkiego:

Początek

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Koniec

UIApplication.shared.isNetworkActivityIndicatorVisible = false
Stephen Darlington
źródło
1
Dzięki temu działa idealnie. Na marginesie: symulator wydaje się ignorować tę wartość, co sprawiło, że na początku pomyślałem, że nie działa.
rustyshelf
11
@rustyshelf, wyświetla się w nowszych symulatorach.
MrHus
2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// as a one liner
David Douglas
1
Do użycia składni SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre
2
Wskaźnik aktywności nie pojawi się na pasku stanu w telefonie iPhone X
Melly
30

Uważam, że następujące makra są całkiem przydatne!

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

Możesz więc po prostu zadzwonić ShowNetworkActivityIndicator();lub HideNetworkActivityIndicator();z poziomu aplikacji (o ile oczywiście nagłówek jest dołączony!).

Michael Waterfall
źródło
35
Dlaczego nie zdefiniować kategorii w aplikacji UIApplication? Wydaje się o wiele ładniejszy (i łatwiejszy do debugowania) niż #define.
Barry Wark
25

Napisałem singletona, który rozwiązuje problem wielu połączeń, utrzymując licznik tego, co się dzieje (aby uniknąć usuwania statusu, gdy połączenie powraca, ale inne jest nadal aktywne):

Plik nagłówkowy:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;

+(RMActivityIndicator *)sharedManager;

@end

i realizacja:

#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

Przykład:

    [[RMActivityIndicator sharedManager]increaseActivity];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        [[RMActivityIndicator sharedManager]decreaseActivity];
    }
Resh32
źródło
3
Dzięki @Schrockwell, ulepszyłem go dalej, używając zsynchronizowanych bloków - widziałem stan wyścigu, w którym aktywność nie została odpowiednio zmniejszona.
Resh32,
3
Ładny przykład, jak robić proste rzeczy trudne)
fnc12
19

Służy do tego jednoliniowy kod:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
popielaty
źródło
5

Musisz zadbać o ukrycie wskaźnika aktywności również po zakończeniu połączenia sieciowego.

Jeśli używasz AFNetworking, nie musisz dużo robić.

Dokonaj następujących zmian w AppDelegateklasie:

  1. Import AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Włóż to didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

Babu Lal
źródło
1
Lub z restkitem będzie to #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
deepwinter
4

Wskaźnik aktywności sieci na pasku stanu został wycofany w systemie iOS 13 .

Używanie UIApplication.shared.isNetworkActivityIndicatorVisible = truenie będzie już działać.

Komunikat o wycofaniu mówi:

W razie potrzeby zapewnij niestandardowy interfejs użytkownika aktywności sieciowej w swojej aplikacji.

M Reza F.
źródło
2

Pomocne może być również upewnienie się, że uruchamiasz go w głównym wątku, ponieważ jest to związane z interfejsem użytkownika.

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
Sev
źródło
0

Jak wielu powiedziało, nie ma wskaźnika aktywności sieciowej dla iPhone'a X i prawdopodobnie dla innych nowych iPhone'ów z wycięciem.

Natknąłem się na tę niesamowitą bibliotekę napisaną przez Ortwina Gentza, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Umieszcza wskaźnik z powrotem w miejscu, w którym znajdował się w momencie premiery iPhone'a X, wielu zapamiętałoby wskaźnik typu Knight Rider.

Ta biblioteka jest dostępna dla Swift 4.2, więc będziesz musiał zmienić ustawienia języka Swift, jak opisano tutaj: Wpisz „NSAttributedStringKey” (aka „NSString”) nie ma „czcionki” elementu członkowskiego

erickva
źródło