Cách hiển thị chỉ báo tải trong thanh trạng thái trên cùng


120

Tôi đã nhận thấy rằng một số ứng dụng như Safari và Mail hiển thị chỉ báo tải trên thanh trạng thái (thanh ở trên cùng của điện thoại) khi chúng đang truy cập mạng. Có cách nào để làm điều tương tự trong các ứng dụng SDK hay đây là cách duy nhất của Apple?

Câu trả lời:


213

Nó nằm trong Ứng dụng UIA:

Đối với Mục tiêu C:

Khởi đầu:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

Kết thúc:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Đối với nhanh chóng:

Khởi đầu

UIApplication.shared.isNetworkActivityIndicatorVisible = true

Kết thúc

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
Cảm ơn nó hoạt động hoàn hảo. Chỉ là một lưu ý phụ: trình mô phỏng dường như bỏ qua giá trị này, điều này khiến tôi nghĩ lúc đầu nó không hoạt động.
rỉ sét

11
@rustyshelf, nó hiển thị trong trình mô phỏng mới hơn.
MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// như một liner
David Douglas

1
Để sử dụng cú pháp SwiftUIApplication.sharedApplication().networkActivityIndicatorVisible = true
moraisandre

2
Chỉ báo hoạt động sẽ không hiển thị trên thanh trạng thái trên iPhone X
Melly

30

Tôi thấy các macro sau đây khá hữu ích!

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

Vì vậy, bạn có thể chỉ cần gọi ShowNetworkActivityIndicator();hoặc HideNetworkActivityIndicator();từ trong ứng dụng của mình (tất nhiên là miễn là có tiêu đề!).


35
Tại sao không xác định một danh mục trên UIApplication? Có vẻ đẹp hơn nhiều (và dễ gỡ lỗi hơn) so với #define.
Barry Wark

25

Tôi đã viết một singleton giải quyết vấn đề của nhiều kết nối bằng cách giữ một bộ đếm những gì đang xảy ra (để tránh xóa trạng thái khi một kết nối quay trở lại nhưng một kết nối khác vẫn hoạt động):

Tệp tiêu đề:

#import <Foundation/Foundation.h>

@interface RMActivityIndicator : NSObject

-(void)increaseActivity;
-(void)decreaseActivity;
-(void)noActivity;

+(RMActivityIndicator *)sharedManager;

@end

Và thực hiện:

#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

Thí dụ:

    [[RMActivityIndicator sharedManager]increaseActivity];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:self.networkReceiveProcessQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        [[RMActivityIndicator sharedManager]decreaseActivity];
    }

3
Cảm ơn @Schrockwell, tôi đã cải thiện nó hơn nữa bằng cách sử dụng các khối được đồng bộ hóa - tôi đã thấy tình trạng cuộc đua trong đó hoạt động không giảm đúng cách.
Resh32

3
Ví dụ tuyệt vời về cách làm những điều đơn giản khó)
fnc12

19

Một mã dòng duy nhất để làm điều đó:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

5

Bạn cũng cần chú ý đến việc ẩn chỉ báo hoạt động sau khi cuộc gọi mạng của bạn hoàn tất.

Nếu bạn sử dụng AFNetworking, thì bạn không cần phải làm gì nhiều.

Thực hiện các thay đổi sau trong AppDelegateLớp:

  1. Nhập khẩu AFNetworking/AFNetworkActivityIndicatorManager.h

  2. Đặt cái này vào didFinishLaunchingWithOptions:

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]


1
Hoặc với restkit thì nó sẽ là #import [[AFRKNetworkActivityIndicatorManager sharedManager] setEnabled: YES];
deepwinter 21/09/17

4

Chỉ báo hoạt động mạng trên thanh trạng thái không được dùng nữa trong iOS 13 .

Sử dụng UIApplication.shared.isNetworkActivityIndicatorVisible = truesẽ không hoạt động nữa.

Thông báo ngừng sử dụng cho biết:

Cung cấp giao diện người dùng hoạt động mạng tùy chỉnh trong ứng dụng của bạn nếu muốn.


2

Nó cũng có thể hữu ích để đảm bảo rằng bạn đang chạy nó trên chuỗi chính vì nó liên quan đến giao diện người dùng.

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

0

Như nhiều người đã nói, không có chỉ báo hoạt động mạng cho iPhone X và có thể cho các iPhone mới khác có notch.

Tôi đã xem qua thư viện đáng kinh ngạc này được viết bởi Ortwin Gentz, FutureTap: https://github.com/futuretap/FTLinearActivityIndicator

Nó đưa chỉ báo trở lại vị trí ban đầu khi iPhone X được phát hành, nhiều người sẽ nhớ loại chỉ báo Knight Rider.

Thư viện này có sẵn cho Swift 4.2, vì vậy bạn sẽ cần thay đổi cài đặt Ngôn ngữ Swift, như được mô tả ở đây: Nhập 'NSAttributedStringKey' (hay còn gọi là 'NSString') không có thành viên 'phông chữ'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.