iOS6에서 특정 View Controller에서의 화면 회전(Auto rotation) 제어하기

h3 앱을 구현하면서 릴리즈 후 modal 된 view controller 들이 회전이 되어버리는 문제가 생겨서 이 부분을 수정하였다. 수정한 것을 설명하기 이전에 알아두어야 할 것은 auto rotation에 관련된 base method가 변경되었다는 것이다. UIViewController를 들여다보면 이전에 사용하던 – (BOOL)shouldAutorotateToInterfaceOrientation: 메소드가 deprecated되고, 대신 -(BOOL)shouldAutorate 메소드와 -(NSUInteger)supportedInterfaceOrientations,  -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentations 가 추가된 것을 볼 수 있다. 즉, iOS6에서는 기존에 사용하던 메소드가 동작하지 않는다는 것이며, 새로운 메소드를 이용해야 한다는 것을 볼 수 있다. Deployment target이 5.x 일 경우에는 기존 메소드를 정의해놓는 것은 잊지 말고… 처음에 언급했던 이슈에 대해서는 사실 메뉴와 컨텐츠가 위치한 main view controller에서 미리 적용하여 문제가 없었으나, 로그인/회원가입, 사전등록 페이지에서는 화면이 돌아가버리는 문제점이 생겼다. 위의 메소드가 적용되었음에도 말이다. 이 문제 해결을 위해 애플 공식 문서를 비롯해 여러 자료를 참고하다보니 언뜻 떠오른 방법이 생각나 이를 적용했더니 깔끔하게 해결되었다. 문제는 view controller가 modal 할 때 UINavigationController를 품고 modal 되니 auto rotation의 주체는 view controller가 아닌 UINavigationController였다. 따라서, UINavigationController를 상속받는 custom view controller를 정의하여 여기에 -(BOOL)shouldAuotorate와 – (NSUInteger)supportedInterfaceOrientations를 아래와…

UINavigationController에 UIGestureRecognizer 등록하기

사내에서 Path 2 리뷰를 했습니다. 리뷰 포스트는 여기를 누르시면 보실 수 있습니다. 포스트에 등록된 댓글에 UINavigationController에 UIGestureRecognizer 등록한 부분에 대한 상세한 설명 부탁하신 분에게 도움이 되었으면 합니다. 사실 퀵리뷰를 위한 Demo여서 견고하게 구현하지 않았고 설명에서 제외했었습니다. 참고하셔서 더 멋진 앱 만들어주세요. 🙂   1.UINavigationController를 상속받는 클래스를 생성합니다. UINavigationController의 구조에 대한 Documentation을 보면 알겠지만 UINavigationController는 UINavigationController에 설정되는 rootViewController보다 상위. 즉, 부모 클래스입니다. 따라서 터치 등의 이벤트를 받는 UIResponder는 UINavigationController의 view를 먼저 거치게 됩니다. 2. 생성된 클래스의 – (void)loadView; 또는 -(void)viewDidLoad; 메소드에 UISwipeGestureRecognizer를 정의합니다. 물론 – (void)touchesBegin: 등의 터치 이벤트 관련 메소드로 정의를 하셔도 됩니다만 손이 많이 갈 수 있어서 좌/우 각각에 대한 UISwipeGestureRecognizer를 이용하였습니다. – (void)loadView { [super loadView]; UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onList)]; leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft; [self.view addGestureRecognizer:leftSwipeGestureRecognizer]; [leftSwipeGestureRecognizer release]; UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onMenu)]; rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight; [self.view addGestureRecognizer:rightSwipeGestureRecognizer]; [rightSwipeGestureRecognizer release]; }   3. 좌/우 Gesture에 따라 UINavigationController의 view의 frame 값을 애니메이션을 적용하여 변경합니다. 사실상…