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


120

我注意到,某些应用程序(例如Safari和Mail)在访问网络时会在状态栏中(电话最上方的栏)显示加载指示器。有没有办法在SDK应用程序中做同样的事情,或者这是Apple唯一的事情吗?

Answers:


213

在UIApplication中:

对于目标C:

开始:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

结束:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

为了迅速:

开始

UIApplication.shared.isNetworkActivityIndicatorVisible = true

结束

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
谢谢,这很完美。请注意:模拟器似乎忽略了该值,这让我起初认为它不起作用。
rustyshelf,

11
@rustyshelf,它将显示在较新的模拟器中。
MrHus 2011年

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];//作为一个班轮
David Douglas

1
对于Swift语法使用UIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
该活动的指标将不会在iPhone上的X状态栏显示
梅利

30

我发现以下宏非常有用!

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

因此,您可以直接在应用程序中调用ShowNetworkActivityIndicator();HideNetworkActivityIndicator();从应用程序中调用(当然,只要包含标题即可!)。


35
为什么不在UIApplication上定义类别?似乎比#define更好(而且更可调试)。
巴里·沃克

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

19

只需一行代码即可:

[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的位置,许多人会记得Knight Rider类型的指示器。

该库可用于Swift 4.2,因此您需要按以下说明更改Swift语言设置: 类型'NSAttributedStringKey'(aka'NSString')没有成员'font'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.