UIViewController 를 이용한 메인뷰 또는 특정뷰에서 일련의 백그라운드 작업시 대기상태를 나타내주는 여러 방법(Modal Popup, Spinner, SubView 등...)들 중에, 카테고리를 이용하여 간단한 Method 호출로 UIViewController 에 오버레이되는 View 를 생성해 보자.
CREATE CATEGORY
UIViewControll+OverlayView.h
#import <UIKit/UIKit.h>
@interface UIViewController (OverlayView)
-(void)showLayer:(NSString *)message;
-(void)hideLayer;
@end
UIViewController+OverlayView.m
#import "UIViewController+OverlayView.h"
@implementation UIViewController (OverlayView)
-(void)showLayer:(NSString *)message
{
UIView *layer = [[UIView alloc] initWithFrame:self.view.bounds];
// layer.alpha = 0.5;
layer.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.5];
/* Create Label */
UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];
label.textAlignment = UITextAlignmentCenter;
label.lineBreakMode = YES; // 개행 설정.
label.numberOfLines = 0; // 개행 숫자에 제한을 두지 않음.
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.text = message;
[layer addSubview:label];
[label release];
/* Add LayerView */
[self.view addSubview:layer];
[layer release];
}
-(void)hideLayer
{
NSArray *subViews = [self.view subviews];
UIView *layer = [subViews lastObject];
[layer removeFromSuperview];
}
@end
※ alpha 를 적용하게되면, UIView *layer 에 올라오는 컨트롤 및 서브뷰들도 해당 alpha value 가 적용되어 보여진다. 반면, backgroundColor 는 해당 View 에만 alpha value 가 적용된다.
USING CATEGORY
ViewController.m
#import "ViewController.h"
#import "UIViewController+OverlayView.h"
@implementation ViewController
- (IBAction)onBtnAction:(id)sender {
[self showLayer:@"MESSAGE TO SHOW"];
[self performSelector:@selector(onHideLayer) withObject:nil afterDelay:2.0f];
}
- (void)onHideLayer
{
[self hideLayer];
}
@end
테스트를 위해, 생성된 오버레이뷰를 performSelector 로 2초후 해제되게 작성. UIViewController 를 서브클래싱하는 클래스들에서 해당 카테고리를 임포트하여, 간단히 카테고리 메소드 호출.
RESULT
스크린샷 처럼, Spinner (UIActivityIndicatorView) 를 표시하거나 기타 다른 컨트롤뷰도 해당 오버레이뷰에 추가하여 프로젝트 성격에 맞게끔 커스터마이징.
/* Create Spinner */
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
spinner.center = CGPointMake(160, 200);
spinner.hidesWhenStopped = NO;
spinner.tag = 100;
[layer addSubview:spinner];
[spinner startAnimating];
[spinner release];
반응형
댓글