Üst durum çubuğunda yükleme göstergesi nasıl gösterilir


120

Safari ve Mail gibi bazı uygulamaların, ağa erişirken durum çubuğunda (telefonun en üstündeki çubuk) bir yükleme göstergesi gösterdiğini fark ettim. SDK uygulamalarında aynı şeyi yapmanın bir yolu var mı, yoksa bu yalnızca Apple mı?

Yanıtlar:


213

UIApplication içinde:

Amaç C için:

Başlat:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Son:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Hızlı için:

Başlat

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Son

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
Mükemmel çalışıyor teşekkürler. Sadece bir yan not: simülatör bu değeri görmezden geliyor gibi görünüyor, bu da bana ilk başta işe yaramadığını düşündürdü.
rustyshelf

11
@rustyshelf, yeni simülatörlerde görüntülenir.
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// tek astar olarak
David Douglas

1
Swift sözdizimini kullanmak içinUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
Etkinlik göstergesi iPhone X'in durum çubuğunda görünmeyecek
Melly

30

Aşağıdaki makroları oldukça faydalı buldum!

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

Böylece, yalnızca uygulamanızdan ShowNetworkActivityIndicator();veya HideNetworkActivityIndicator();uygulamanızdan arayabilirsiniz (elbette başlık dahil olduğu sürece!).


35
Neden UIApplication'da bir kategori tanımlamıyorsunuz? # Tanımlamadan çok daha güzel (ve hata ayıklaması daha kolay) görünüyor.
Barry Wark

25

Neler olduğuna dair bir sayaç tutarak birden fazla bağlantı sorununu çözen bir singleton yazdım (bir bağlantı geri döndüğünde ancak bir diğeri hala aktif olduğunda durumu kaldırmaktan kaçınmak için):

Başlık dosyası:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

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

+(RMActivityIndicator *)sharedManager;

@end

Ve uygulama:

#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

Misal:

    [[RMActivityIndicator sharedManager]increaseActivity];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        [[RMActivityIndicator sharedManager]decreaseActivity];
    }

3
Teşekkürler @Schrockwell, senkronize bloklar kullanarak bunu daha da geliştirdim - aktivitenin düzgün bir şekilde azaltılmadığı bir yarış durumu gördüm.
Resh32

3
Basit şeylerin nasıl zor yapılacağına dair güzel bir örnek)
fnc12

19

Bunu yapmak için tek satırlı bir kod:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

Şebeke aramanız bittiğinde de etkinlik göstergesini gizlemeye dikkat etmeniz gerekir.

Eğer kullanırsanız AFNetworking, fazla bir şey yapmanıza gerek kalmaz.

AppDelegateSınıfta aşağıdaki değişiklikleri yapın :

  1. İthalat AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Bunu koy didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
Veya restkit ile #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES] olacaktır;
deepwinter

4

Durum çubuğu ağ etkinliği göstergesi iOS 13'te kullanımdan kaldırıldı .

Kullanmak UIApplication.shared.isNetworkActivityIndicatorVisible = trueartık işe yaramayacak.

Kullanımdan kaldırma mesajı şöyle diyor:

İsterseniz uygulamanızda özel bir ağ etkinliği kullanıcı arayüzü sağlayın.


2

Ayrıca, UI ile ilgili olduğu için ana iş parçacığı üzerinde çalıştırdığınızdan emin olmanız da yararlı olabilir.

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

0

Birçoğunun söylediği gibi, iPhone X için ve muhtemelen çentikli diğer yeni iPhone'lar için ağ etkinliği göstergesi yoktur.

Ortwin Gentz, FutureTap tarafından yazılan bu inanılmaz kitaplığa rastladım: https://github.com/futuretap/FTLinearActivityIndicator

Göstergeyi, iPhone X'in ilk piyasaya sürüldüğü zaman olduğu yere koyuyor, çoğu kişi Knight Rider tipi göstergeyi hatırlayacaktı.

Bu kitaplık Swift 4.2 için mevcuttur, bu nedenle Swift Dili ayarlarını burada açıklandığı gibi değiştirmeniz gerekecektir: 'NSAttributedStringKey' yazın (diğer adıyla 'NSString') üye 'yazı tipi' içermiyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.