상단 상태 표시 줄에 로딩 표시기를 표시하는 방법


120

Safari 및 Mail과 같은 일부 앱이 네트워크에 액세스 할 때 상태 표시 줄 (전화기 맨 위에있는 표시 줄)에 로딩 표시기가 표시되는 것을 확인했습니다. SDK 앱에서 동일한 작업을 수행 할 수있는 방법이 있습니까? 아니면 이것이 Apple 전용입니까?

답변:


213

UIApplication에 있습니다.

목표 C의 경우 :

스타트:

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

종료:

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

신속한 :

스타트

UIApplication.shared.isNetworkActivityIndicatorVisible = true

종료

UIApplication.shared.isNetworkActivityIndicatorVisible = false

1
완벽하게 작동하는 감사합니다. 참고 사항 : 시뮬레이터는이 값을 무시하는 것 같아서 처음에는 작동하지 않는다고 생각했습니다.
— rustyshelf

11
@rustyshelf, 최신 시뮬레이터에 표시됩니다.
— MrHus

2
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// 하나의 라이너로
— David Douglas

1
Swift 구문 사용UIApplication.sharedApplication().networkActivityIndicatorVisible = true
— moraisandre

2
iPhone X의 상태 표시 줄에 활동 표시기가 표시되지 않습니다
— Melly

30

다음 매크로가 매우 유용하다는 것을 알았습니다!

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

따라서 앱 내에서 ShowNetworkActivityIndicator();또는 전화를 걸 HideNetworkActivityIndicator();수 있습니다 (물론 헤더가 포함되어있는 한!).


35
UIApplication에 범주를 정의하지 않는 이유는 무엇입니까? #define보다 훨씬 더 멋지고 디버깅 가능해 보입니다.
— Barry Wark

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 [[AFRKNetworkActivityIndicatorManager 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에 대한 네트워크 활동 표시기가 없습니다.

FutureTap 인 Ortwin Gentz가 작성한이 놀라운 라이브러리를 발견했습니다 : https://github.com/futuretap/FTLinearActivityIndicator

표시기를 iPhone X가 처음 출시되었을 때의 위치로 되 돌리면 많은 사람들이 Knight Rider 유형의 표시기를 기억할 것입니다.

이 라이브러리는 Swift 4.2에서 사용할 수 있으므로 여기에 설명 된대로 Swift 언어 설정을 변경해야합니다. Type 'NSAttributedStringKey'(일명 'NSString')에는 'font'멤버가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.