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


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.