전에 iOS6 회전에 관련한 글을 올렸었다.

http://devnote2.tistory.com/entry/iOS6-shouldAutorotateToInterfaceOrientation-문제
http://devnote2.tistory.com/entry/iOS6-shouldAutorotateToInterfaceOrientation-문제2

위 문제 외 한가지 더 확인해야 될 상황이 생겼다. 기존 구조에서는 NavigationController를 상속 받아 모달에 넣어 띄우는 것을 기본으로 사용하여 이번에 생긴 문제를 제대로 확인 하지 못했는데 다시 테스트 해보니 navigationController의 회전 설정 값이 우선되어 하위 ViewController의 값이 제대로 적용되지 않았다.

즉 NavigationController의 shouldAutorotate 값이 하위 뷰컨트롤러의 값을 호출하지 못해 회전값을 뷰컨트롤러 단위로 설정하기 어려운 상황이였다.

즉 따로 UINavigationController를 상속받아 회전값을 설정하는 방법외에 기본 UINavigationController로만 회전 값을 제어하기 위해서 알아본 결과 카테고리를 통해 하위 UIViewController에서 UINavigationController의 shouldAutorotate 함수를 덮어 기능을 제한하는 방법이 가장 간편한 방법을 것같다.

아래의 테스트 코드로 확인하였다.

#import "ViewController.h"

@implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    self.view.backgroundColor = [UIColor whiteColor];
 // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(BOOL) shouldAutorotate {
    return NO;
}

-(NSUInteger) supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

@end

 

즉 UINavigationController의 shouldAutorotate 가 실행될 때 하위뷰에서 그 메소드를 후킹(?) 해서 회전 값에 대한 정보를 변경하는 것이 포인트이다.

 

요구사항에 따라 아이폰에 토스트 팝업을 만들일이 생겼다. (아이폰에 토스트 팝업이라니!!!)

그래서 여러 고민 끝에 결론은

어디에서나 화면에 보이는 UIWindow내에 UIView를 삽입하여 화면에 띄우고 애니메이션으로 출력후 종료하도록 하였다.

뷰를 삽입 후 애니메이션으로 출력, 종료까지 잘되었지만 발목을 잡은 것은 바로 회전이였다.

회전을 하게 되면 UIViewController에서 표시되는 뷰와 따로 놀게되고 회전할때도 각각 돌아가게되어 뷰의 모습이 깨지게 되었다.

확인 끝에 중요한 차이점을 알게 되었다

바로 뷰를 삽입하는 방식인다. 기존방식은 새로운 UIWindow를 생성하여 UIView를 입력하는 방식이다.

- (void) makeAlertWindow {

    UIWindow * statusWindow =[[UIWindow alloc]initWithFrame:self.bounds];

    statusWindow.windowLevel = UIWindowLevelAlert;

    statusWindow.hidden = NO;

    statusWindow.backgroundColor = COLOR_CLEAR;

    statusWindow.userInteractionEnabled = NO;

    [statusWindow makeKeyWindow];

    [statusWindow addSubview:self];

    self.alertWindow = statusWindow;

    [statusWindow release];

}


이렇게 만들고나서 회전문제를 처리하려고하니 위와 같은 많은 문제점이 생겼다. 

찾아본 결과 간단한 해결방법이 있었다.

- (void) makeAlertWindow {

    ///< 뷰를 윈도우에 추가하기 위해서 써야한다!!!!!    

    [[[UIApplication sharedApplication] keyWindow] addSubview:self];

}


이렇게 UIView를 삽입하고 나면 UIViewController의 회전과 UIView의 회전이 일치하게 되어 회전 문제를 처리하기 쉽게 되었다.

첨부파일로 소스 전체를 올린다.

'iOS' 카테고리의 다른 글

UITableViewCell 다루기  (0) 2012.02.06
TCP Dump  (0) 2011.12.29
UITableViewCell Custom 오른쪽 화살표 버튼 이미지  (0) 2011.12.27
유용한 오픈소스 링크  (0) 2011.12.21
ActionSheet 버튼 스타일 변경작업  (0) 2011.12.16

+ Recent posts