So zeigen Sie die Ladeanzeige in der oberen Statusleiste an

120

Ich habe festgestellt, dass einige Apps wie Safari und Mail beim Zugriff auf das Netzwerk eine Ladeanzeige in der Statusleiste (die Leiste ganz oben auf dem Telefon) anzeigen. Gibt es eine Möglichkeit, dasselbe in SDK-Apps zu tun, oder ist dies nur eine Sache von Apple?

rostig
quelle

Antworten:

213

Es ist in UIApplication:

Für Ziel C:

Anfang:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Ende:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Für schnell:

Anfang

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Ende

UIApplication.shared.isNetworkActivityIndicatorVisible = false
Stephen Darlington
quelle
1
Danke, das funktioniert perfekt. Nur eine Randnotiz: Der Simulator scheint diesen Wert zu ignorieren, was mich zunächst denken ließ, dass es nicht funktioniert hat.
Rustyshelf
11
@rustyshelf wird in den neueren Simulatoren angezeigt.
MrHus
2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// als Einzeiler
David Douglas
1
Für Swift-Syntax verwendenUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre
2
Die Aktivitätsanzeige wird nicht in der Statusleiste des iPhone X
Melly
30

Ich fand die folgenden Makros ziemlich nützlich!

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

Sie können also einfach anrufen ShowNetworkActivityIndicator();oder HideNetworkActivityIndicator();aus Ihrer App heraus (sofern der Header natürlich enthalten ist!).

Michael Wasserfall
quelle
35
Warum nicht eine Kategorie für UIApplication definieren? Scheint viel schöner (und debuggbarer) als ein #define.
Barry Wark
25

Ich habe einen Singleton geschrieben, der das Problem mehrerer Verbindungen löst, indem er einen Zähler für das Geschehen hält (um zu vermeiden, dass der Status entfernt wird, wenn eine Verbindung zurückkehrt, aber eine andere noch aktiv ist):

Die Header-Datei:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

und Umsetzung:

#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

Beispiel:

    [[RMActivityIndicator sharedManager]increaseActivity];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        [[RMActivityIndicator sharedManager]decreaseActivity];
    }
Resh32
quelle
3
Dank @Schrockwell habe ich es durch die Verwendung synchronisierter Blöcke weiter verbessert. Ich habe eine Rennbedingung gesehen, bei der die Aktivität nicht richtig verringert wurde.
Resh32
3
Schönes Beispiel, wie man einfache Dinge schwierig macht)
fnc12
19

Ein einzeiliger Code dafür:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
asish
quelle
5

Sie müssen darauf achten, dass die Aktivitätsanzeige auch nach Abschluss Ihres Netzwerkanrufs ausgeblendet wird.

Wenn Sie verwenden AFNetworking, müssen Sie nicht viel tun.

Nehmen Sie folgende Änderungen in der AppDelegateKlasse vor:

  1. Importieren AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Gib das ein didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

Babu Lal
quelle
1
Oder mit restkit ist es #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
Deepwinter
4

Die Netzwerkaktivitätsanzeige in der Statusleiste war in iOS 13 veraltet .

Die Verwendung UIApplication.shared.isNetworkActivityIndicatorVisible = truefunktioniert nicht mehr.

Die Verfallsmeldung lautet:

Stellen Sie bei Bedarf eine benutzerdefinierte Benutzeroberfläche für Netzwerkaktivitäten in Ihrer App bereit.

M Reza F.
quelle
2

Es kann auch hilfreich sein, sicherzustellen, dass Sie es auf dem Hauptthread ausführen, da es mit der Benutzeroberfläche zusammenhängt.

dispatch_async(dispatch_get_main_queue(), ^{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
Sev
quelle
0

Wie viele gesagt haben, gibt es keine Netzwerkaktivitätsanzeige für das iPhone X und wahrscheinlich für die anderen neuen iPhones mit der Kerbe.

Ich bin auf diese unglaubliche Bibliothek gestoßen, die von Ortwin Gentz, FutureTap, geschrieben wurde: https://github.com/futuretap/FTLinearActivityIndicator

Dadurch wird der Indikator wieder genau dort platziert, wo er zum Zeitpunkt der Veröffentlichung des iPhone X war. Viele würden sich an den Indikator vom Typ Knight Rider erinnern.

Diese Bibliothek ist für Swift 4.2 verfügbar, daher müssen Sie die Swift -Spracheinstellungen wie hier beschrieben ändern: Typ 'NSAttributedStringKey' (auch bekannt als 'NSString') hat kein Mitglied 'font'.

erickva
quelle