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
타이머 참고
https://zetal.tistory.com/entry/UIBackgroundTaskIdentifier-vs
'아이폰 개발 > ios 개념&튜토리얼' 카테고리의 다른 글
iOS UNNotificationServiceExtension 예제 Push Sound (1) | 2021.02.05 |
---|---|
iOS 화면보호기 예제 (0) | 2021.02.03 |
iOS WKWebView 예제 (0) | 2021.01.30 |
NSURLSession 공통 모듈 예제 (0) | 2021.01.29 |
iOS 공통 로그 예제 (0) | 2021.01.28 |