본문 바로가기
아이폰 개발/ios 개념&튜토리얼

iOS UIActivityIndicatorView 예제

by 인생여희 2021. 2. 2.

iOS UIActivityIndicatorView 예제

 

 

 

 

 

1.UIView를 상속한 로딩뷰 만들기

 

 

ActivityView.h

 

엑티비티인티게이터와 표시할 라벨을 변수로 설정해준다.

 

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface ActivityView : UIView

//싱글턴 패턴
+(ActivityView *)sharedObject;

@property (nonatomic, retain) UIActivityIndicatorView * activityView;
@property (nonatomic, retain) UILabel *loadingLabel;


@end

NS_ASSUME_NONNULL_END

 

 

ActivityView.m

 

변수로 설정한 인디케이터와 라벨을 초기화 해주고, 오토레이아웃을 생성해 준다.

 

#import "ActivityView.h"

@implementation ActivityView

@synthesize activityView, loadingLabel;

+ (ActivityView *)sharedObject{
    
    NSLog(@"sharedObject 호출 ");
    
    static ActivityView *activityView = nil;
    
    /*
        dispatch_once_t는 dispatch_once가 실행되었는지 여부를 저장하고 있는 포인터 변수.
        이 값을 보존하지 못한다면 여러번 실행될 수 있음.
        최초값 : 0
     */
    static dispatch_once_t onceToken;
    
    /*
     최초로 실행될때 onceToken에 값이 들어간다.
     값이 0 일때만 한 번 실행된다. 이후 값이 존재할때는 아래 로직 실행안됨.
    */
     dispatch_once(&onceToken, ^{
         //객체는 단 하나만 생성된다.
        activityView = [[self alloc]init];
        
    });
    
    return activityView;
}

//초기화 - 단 한번 실행됨
- (id)init
{
    self = [super init];
    if (self) {
        
        //1.뷰 속성 설정
        self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];;
        self.clipsToBounds = YES;
        self.layer.cornerRadius = 10.0;
        
        //2.엑티비티 뷰
        activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
        activityView.backgroundColor = UIColor.lightGrayColor;
        
        //3.로딩 라벨..
        loadingLabel = [[UILabel alloc] init];
        loadingLabel.backgroundColor = [UIColor clearColor];
        loadingLabel.textColor = [UIColor whiteColor];
        loadingLabel.adjustsFontSizeToFitWidth = YES;
        [loadingLabel setTextAlignment:NSTextAlignmentCenter];
        loadingLabel.text = @"Loading...";

        
        //4.뷰 객체 상위 뷰에 넣기
        [self addSubview:activityView];
        [self addSubview:loadingLabel];
        
        
        //5..오토레이아웃 활성화
        activityView.translatesAutoresizingMaskIntoConstraints = false;
        loadingLabel.translatesAutoresizingMaskIntoConstraints = false;


        //6.오토레이아웃 설정 - self..로 접근하면 오류 발생..
        /* 액티비티 뷰 레이아웃 */
        [[activityView.heightAnchor constraintEqualToConstant:50.0] setActive:TRUE];
        [[activityView.widthAnchor constraintEqualToConstant:50.0] setActive:TRUE];
        [[activityView.centerYAnchor constraintEqualToAnchor:self.centerYAnchor constant:-150] setActive:TRUE];
        [[activityView.centerXAnchor constraintEqualToAnchor:self.centerXAnchor] setActive:TRUE];

        //7.
        /* 로딩 라벨.. 레이아웃 */
        [[loadingLabel.heightAnchor constraintEqualToConstant:20.0] setActive:TRUE];
        [[loadingLabel.widthAnchor constraintEqualToConstant:50.0] setActive:TRUE];
        [[loadingLabel.centerYAnchor constraintEqualToAnchor:activityView.centerYAnchor constant:40]setActive:TRUE];
        [[loadingLabel.centerXAnchor constraintEqualToAnchor:activityView.centerXAnchor]setActive:TRUE];
                
    }
    return self;
}

@end

 

 

 

2.사용하기

 

위에서 만든 로딩뷰를 임포트해주고, 초기화해서 사용한다. 타이머를 변수로 두고, 진입시 인디케이터를 켜고, 3초뒤 인디케이터를 해제 하도록 한다.

 

 

 

ViewController.h

 

#import <UIKit/UIKit.h>
#import "ActivityView.h"
@interface ViewController : UIViewController
{
    NSTimer *timer;
}

@end

 

 

 

ViewController.m

 

#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    //[ActivityView sharedObject] = 싱글톤 객체
    //1.상위뷰에 넣기
    [self.view addSubview:[ActivityView sharedObject]];
    
    //2.오토레이아웃 허용 설정
    [ActivityView sharedObject].translatesAutoresizingMaskIntoConstraints = false;
    
    //3.위치 설정
    [[[ActivityView sharedObject].heightAnchor constraintEqualToConstant:self.view.frame.size.height] setActive:TRUE];
    [[[ActivityView sharedObject].widthAnchor constraintEqualToConstant:self.view.frame.size.width] setActive:TRUE];
    [[[ActivityView sharedObject].centerYAnchor constraintEqualToAnchor:self.view.centerYAnchor]setActive:TRUE];
    [[[ActivityView sharedObject].centerXAnchor constraintEqualToAnchor:self.view.centerXAnchor]setActive:TRUE];
    
    
    //4.엑티비티 뷰 시작 - !
    [[ActivityView sharedObject].activityView startAnimating];
    
    
    /*
     앱의 상태가 백그라운드로 들어가도 특정 작업을 가능하게 해 줍니다.
     UIBackgroundTaskIdentifier가 생성될 때 백그라운드에서 작업이 시작되는 것이 아닙니다.
     UIBackgroundTaskIdentifier를 생성하여 os에게 이다음 작업은 백그라운드에서도 진행되길 원한다는 것을 알리는 것입니다.
     */
    UIBackgroundTaskIdentifier bgTask = 0;
    UIApplication  *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
    
    //타이머 객체 생성
    NSString *str = @"Timer";
    timer = [NSTimer scheduledTimerWithTimeInterval:3.0
                   target:self
                   selector:@selector(updateMethod:)
                   userInfo:str
                   repeats:YES];


}


- (void) updateMethod:(NSTimer *)incomingTimer {
    
    NSLog(@"Inside update method");
    
    if ([incomingTimer userInfo] != nil){
        NSLog(@"userInfo: %@", [incomingTimer userInfo]);
    }
    
    //액티비티 정지
    //엑티비티 뷰 - self.viewd에서 제거
    [[ActivityView sharedObject].activityView stopAnimating];
    [[ActivityView sharedObject] removeFromSuperview];
    
    [timer invalidate];
}
    
@end

 

 

 

ActivityViewTest 2.zip
0.06MB

 

 

 

타이머 참고

https://www.letmecompile.com/nstimer-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%A7%84%EC%9E%85%EC%8B%9C-%EB%8F%99%EC%9E%91-%EB%B6%84%EC%84%9D/

https://ddirty.tistory.com/23

https://zetal.tistory.com/entry/UIBackgroundTaskIdentifier-vs

https://m.blog.naver.com/PostView.nhn?blogId=horajjan&logNo=220572128417&targetKeyword=&targetRecommendationCode=1