トップステータスバーに読み込みインジケータを表示する方法


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 2008年

11
@rustyshelf、それは新しいシミュレータで表示されます。
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];//ワンライナーとして
David Douglas

1
Swift構文の使用UIApplication.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 '29

19

そのための1行のコード:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

ネットワークコールが終了した後も、アクティビティインジケーターを非表示にする必要があります。

を使用する場合AFNetworking、それほど多くのことをする必要はありません。

AppDelegateクラスで次の変更を行います。

  1. インポート AFNetworking/AFNetworkActivityIndicatorManager.h

  2. これを入れて didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
または、restkitでは#import [[AFRKNetworkActivityIndi​​catorManager sharedManager] setEnabled:YES]になります。
deepwinter

4

ステータスバーのネットワークアクティビティインジケーターはiOS 13で廃止されました

を使用してUIApplication.shared.isNetworkActivityIndicatorVisible = trueも機能しなくなります。

非推奨のメッセージは言う:

必要に応じて、アプリにカスタムネットワークアクティビティUIを提供します。


2

また、UIに関連しているため、メインスレッドで実行していることを確認すると役立つ場合があります。

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

0

多くの人が言っているように、iPhone Xやおそらく他の新しいiPhone用のネットワークアクティビティインジケーターはありません。

Ortwin Gentz、FutureTapによって作成されたこの素晴らしいライブラリに出くわしました:https : //github.com/futuretap/FTLinearActivityIndi​​cator

それはインジケーターをiPhone Xが最初にリリースされたときの位置に戻します。多くの人はナイトライダータイプのインジケーターを覚えています。

このライブラリはSwift 4.2で利用できるため、ここで説明するようにSwift言語設定を変更する必要があります。 タイプ 'NSAttributedStringKey'(別名 'NSString')にはメンバー 'font'がありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.