如何在顶部状态栏中显示加载指示器

我注意到一些像 Safari 和 Mail 这样的应用程序在访问网络时会在状态栏(手机顶部的栏)中显示一个加载指示器。有没有一种方法可以在 SDK 应用程序中做同样的事情,或者这只是苹果公司的产品?

48558 次浏览

在 UIApplication:

目标 C:

开始:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

完:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

快速:

开始

UIApplication.shared.isNetworkActivityIndicatorVisible = true

UIApplication.shared.isNetworkActivityIndicatorVisible = false

我发现下面的宏非常有用!

#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;

确保您正在主线程上运行它,因为它是与 UI 相关的,这可能也是有帮助的。

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

一旦完成了网络调用,还需要注意隐藏活动指示器。

如果使用 AFNetworking,则不需要做太多操作。

AppDelegate课程中做以下改变:

  1. 进口 AFNetworking/AFNetworkActivityIndicatorManager.h

  2. 把这个放进 didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]

正如许多人所说的那样,iPhone X 没有网络活动指标,可能其他新款 iPhone 也没有这样的指标。

我偶然发现了这个令人难以置信的图书馆,作者是 Ortwin Gentz,FutureTap: Https://github.com/futuretap/ftlinearactivityindicator

它使指示器回到了 iPhone X 最初发布时的位置,许多人还记得 Knight Rider 类型的指示器。

这个库适用于 Swift 4.2,所以你需要更改 Swift 语言设置,如下所述: Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'

IOS13中不推荐使用状态栏网络活动指示器。

使用 UIApplication.shared.isNetworkActivityIndicatorVisible = true将不再有效。

这条反对信息表示:

如果需要,在应用程序中提供自定义网络活动 UI。