iOS2012. 9. 13. 13:17

UIViewController 를 이용한 메인뷰 또는 특정뷰에서 일련의 백그라운드 작업시 대기상태를 나타내주는 여러 방법(Modal Popup, Spinner, SubView 등...)들 중에, 카테고리를 이용하여 간단한 Method 호출로 UIViewController 에 오버레이되는 View 를 생성해 보자.


CREATE CATEGORY 


UIViewControll+OverlayView.h

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>
 
@interface UIViewController (OverlayView)
 
-(void)showLayer:(NSString *)message;
-(void)hideLayer;
@end

UIViewController+OverlayView.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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) 를 표시하거나 기타 다른 컨트롤뷰도 해당 오버레이뷰에 추가하여 프로젝트 성격에 맞게끔 커스터마이징.

1
2
3
4
5
6
7
8
9
/* 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];

Posted by 다오나무
영삼이의 IT정보2011. 10. 5. 23:43
뷰의 추가 또는 삽입  
[self.view insertSubview:viewController.view atIndex:0];

[self.view addSubview:viewController.view]; 

[self presentModalViewController:viewController animated:YES];  --> 앤 모달뷰

[self.navigationController pushViewController:addView animated:YES]; 

뷰의 순서 바꾸기
[self.view bringSubviewToFront:self.tempViewController.view]; 
-> tempViewController.view를 가장 앞으로 이동한다. 

[self.view sendSubviewToFront:self.tempViewController.view]; 
-> tempViewController.view를 가장 뒤로 이동한다. 

[self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:2]; 
-> 0번 뷰와 2번뷰의 위치를 바꾼다 
   위에서 insertSubView .... atIndex로 뷰의 번호를 지정하면 view가 쌓인다 
   이 순서를 변경할수 있다. 
   주위 해야 할것은 Atindex:number로 뷰를 넣을 경우 해당 뷰가 number로 계속
   지정 되는 것이 아니라 이동후에는 각각의 위치 번호로 된다. 
예) 
[self.view insertSubview:oneController.view atIndex:0];
[self.view insertSubview:twoController.view atIndex:2];
[self.view insertSubview:threeController.view atIndex:2];
--> 이때는 onController.view가      0     
          twoController.view가     1  
          threeController.view가   2   이다. 
여기서 
[self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:2];  하면
onController.view가      2     
twoController.view가     1  
threeController.view가   0  이 된다. 즉 할당된 번호가 계속 따라 다니는 것이 아니라 
최최 지정 할때만 적용 되며 변경 후에는 뷰스택(?)에 샇인 번호로 바뀐다. 
이거 몰라서 3일 버렸다 왜 원하는 대로 안나올까 하고.... 바보 같이.. 
--> 아직까지는 그렇게 알고 있다. 나두 아이폰 관련 개발 공부 한지 인자 몇일 안되서 
    틀린 정보 일수도 있다. 

뷰 스택 로그 찍기 
NSLog([[self.view subviews] description]); 
-> 뷰가 쌓여 있는 스택(?) 순서를 콘솔로 볼수 있다.  
   로그를 볼때는 view에 tag로 번호를 지정한다음에 보면 콘솔에 해당 tag가 나와서 
   한결 보기 편하다. 

뷰 addSubview:뷰

뷰 inserSubview뷰 atIndex:번호

컨트롤러 pushViewController:컨트롤러 애니옵션

컨트롤러 presentModalViewController:컨트롤러 애니옵션

'영삼이의 IT정보' 카테고리의 다른 글

APM UTF-8 설정  (0) 2011.10.21
UITableViewCellStyle 종류  (0) 2011.10.19
윈도우폰이 가져오는 생각의 변화  (0) 2011.09.28
애플, 아이폰 기자 회견 10월 4일 개최!  (0) 2011.09.28
딜라이트샵 구경  (0) 2011.09.27
Posted by 다오나무