web-dev-qa-db-ja.com

上部のステータスバーにローディングインジケーターを表示する方法

SafariやMailなどの一部のアプリは、ネットワークにアクセスしているときにステータスバー(電話の最上部にあるバー)に読み込みインジケーターを表示することに気付きました。 SDKアプリで同じことを行う方法はありますか、これはApple唯一のものですか?

117
rustyshelf

UIApplicationにあります:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

for Swift:

UIApplication.shared.isNetworkActivityIndicatorVisible = true
209

次のマクロが非常に役立つことがわかりました!

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

そのため、アプリ内からShowNetworkActivityIndicator();またはHideNetworkActivityIndicator();を呼び出すことができます(もちろんヘッダーが含まれている限り!)。

30

何が起こっているかのカウンターを保持することにより、複数の接続の問題を解決するシングルトンを作成しました(接続が戻っても別の接続がまだアクティブな場合にステータスが削除されないようにするため):

ヘッダーファイル:

#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];
    }
25
Resh32

それを行う単一行コード:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
19
asish

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

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

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

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

  2. これをdidFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

5
Babu Lal

UIに関連しているため、メインスレッドで実行していることを確認することも役立ちます。

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

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

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

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

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

0
erickva

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

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

非推奨のメッセージは次のとおりです。

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

0