SafariやMailなどの一部のアプリは、ネットワークにアクセスしているときにステータスバー(電話の最上部にあるバー)に読み込みインジケーターを表示することに気付きました。 SDKアプリで同じことを行う方法はありますか、これはApple唯一のものですか?
UIApplicationにあります:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
for Swift:
UIApplication.shared.isNetworkActivityIndicatorVisible = true
次のマクロが非常に役立つことがわかりました!
_#define ShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
#define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
_
そのため、アプリ内からShowNetworkActivityIndicator();
またはHideNetworkActivityIndicator();
を呼び出すことができます(もちろんヘッダーが含まれている限り!)。
何が起こっているかのカウンターを保持することにより、複数の接続の問題を解決するシングルトンを作成しました(接続が戻っても別の接続がまだアクティブな場合にステータスが削除されないようにするため):
ヘッダーファイル:
#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];
}
それを行う単一行コード:
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
ネットワークコールが完了した後も、アクティビティインジケータを非表示にする必要があります。
AFNetworking
を使用する場合、多くのことをする必要はありません。
AppDelegate
クラスで次の変更を行います。
インポートAFNetworking/AFNetworkActivityIndicatorManager.h
これをdidFinishLaunchingWithOptions:
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]
UIに関連しているため、メインスレッドで実行していることを確認することも役立ちます。
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
多くの人が言っているように、iPhone Xにはネットワークアクティビティインジケータがありません。
Ortwin Gentz、FutureTapによって書かれたこの素晴らしいライブラリに出会いました: https://github.com/futuretap/FTLinearActivityIndicator
IPhone Xが最初にリリースされたときの位置にインジケータを戻し、多くの人がナイトライダータイプのインジケータを覚えています。
このライブラリはSwift 4.2で利用できるため、ここで説明するようにSwift言語設定を変更する必要があります。 Type 'NSAttributedStringKey'(別名「NSString」)にはメンバー「font」がありません
ステータスバーのネットワークアクティビティインジケーターは、iOS 1で廃止されました。
UIApplication.shared.isNetworkActivityIndicatorVisible = true
を使用しても機能しなくなります。
非推奨のメッセージは次のとおりです。
必要に応じて、アプリにカスタムネットワークアクティビティUIを提供します。