[ios] iOS 6.0 이상 회전 하기 (이전 버전과 비교 변경 부분)
Attachment '1' |
---|
OS를 업데이트 후 회전이 올바르게 동작하지 않는 것을 보고 당황했습니다.
관련 내용을 찾아보니 어렵지 않게 화면 회전에 대응할 수 있었습니다.
iOS 6.0 이상 및 하위 버전에서 화면 회전을 지원하기 위한 방법을 설명합니다.
iOS 6.0 부터 회전을 지원하는 delegate 메소드가 조금 변경되었습니다.
# iOS 기존 버전에서 화면 회전을 지원하는 코드.
1. window에 view 추가.
[self.window addSubview:viewController.view];
2. UIViewController에 지원할 회전 방향에 대한 delegate 구현
// 자동회전 지원하는 방향 - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight); }
3. UIViewController에서 회전하기 전/후 호출되는 delegate 구현
- (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { // 회전하기 전에 호출됩니다. } - (void)didRotateFromInterfaceOrientation: (UIInterfaceOrientation)fromInterfaceOrientation { // 회전 후에 호출됩니다. }
shouldAutorotateToInterfaceOrientation의 UIInterfaceOrentation 파라미터 타입은..
다음과 같이 enum 타입 상수로 선언되어 있습니다.
typedef NS_ENUM(NSInteger, UIInterfaceOrientation) { UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeRight, UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft };
# iOS 6.0 이상에서는 무엇이 바뀌었을까요?
>> 위의 1번과 2번이 변경되었습니다.
1. window에 rooViewController 추가.
self.window.rootViewController = viewController;
2. UIViewController에 지원할 회전 방향에 대한 delegate 구현
// 자동회전 지원 유무 - (BOOL) shouldAutorotate { return YES; } // 지원하는 회전방향 - (NSUInteger)supportedInterfaceOrientations { return (1 << UIInterfaceOrientationPortrait) | (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight); }
기존에 2가지 역할을 하던 메소드가 자동회전 유무와 회전하는 방향을 반환하는 메소드로 각각 분리되었습니다.
또 지원하는 회전방향의 경우, NSUInteger 반환값으로 변경되었는데 이 값은 아래와 같이 지원하는 회전방향의 비트가 셋팅된 비트 플래그 값입니다.
typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) { UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait), UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft), UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight), UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown), UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown), UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), };
1을 UIInterfaceOrentation 상수값 만큼 왼쪽으로 시프트해주면, 해당하는 방향의 비트를 셋팅할 수 있지요.
또 한가지 중요한 사항은,
커스텀 UINavigationController와 UITabBarController를 사용한 경우, (상속해서 사용하는 경우도 포함)
이 커스텀 클래스의 회전 지원 delegate 메소드에서는 topViewController의 회전지원 delegate 메소드로 위임해야 한다는 것입니다.
아래 코드를 참고
... - (BOOL) shouldAutorotate { return [topViewController shouldAutorotate]; } ...
# iOS 6.0 이상 및 하위 버전에서 화면 회전을 지원하는 코드
위의 설명들을 정리하여,
iOS 6.0 이상 및 하위버전에서 화면 회전을 올바르게 처리하기 위한 코드입니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... // iOS6.0 이상 NSString *currentVersion = [[UIDevice currentDevice] systemVersion]; NSLog(@"%@", currentVersion); if ( [currentVersion compare:@"6.0" options:NSNumericSearch] != NSOrderedAscending ) { self.window.rootViewController = self.viewController; } else { // 하위버전 [self.window addSubview:self.viewController.view]; } [self.window makeKeyAndVisible]; return YES; } #pragma mark - 회전지원 iOS6.0 이상 // 자동회전 지원유무 - (BOOL) shouldAutorotate { return YES; } // 회전방향 지원유무 - (NSUInteger)supportedInterfaceOrientations { return (1 << UIInterfaceOrientationPortrait) | (1 << UIInterfaceOrientationPortraitUpsideDown) | (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight); } #pragma mark - 회전지원 iOS6.0 미만 // 회전방향 지원유무 - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ); } #pragma mark - 회전 델리게이트 // 공통 - (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { // 회전하기 전에 호출됩니다. } - (void)didRotateFromInterfaceOrientation: (UIInterfaceOrientation)fromInterfaceOrientation { // 회전 후에 호출됩니다. }
[출처] http://hiddenviewer.tistory.com/207
No. | Category | Subject | Author | Date | Views |
---|---|---|---|---|---|
32 | Develop | [ios] 아이폰용 앱 오픈 소스들 | hooni | 2013.04.23 | 470343 |
31 | Develop | [ios] 언어, 지역, 국가 설정 가져오기 | hooni | 2014.05.12 | 272344 |
30 | Develop | [ios] Random Thoughts: Rand() vs. arc4random() | hooni | 2013.10.31 | 68125 |
29 | Develop |
[android] SurfaceView를 이용한 애니메이션 ㅎㅎ
![]() |
hooni | 2013.04.23 | 57781 |
28 | Develop | [ios] UIAlertView 초간단 샘플 ㅎㅎ | hooni | 2013.10.14 | 46207 |
27 | Develop | [ios] 배열(NSArray) 연산과 간단한 애니메이션(split images) | hooni | 2013.10.31 | 45601 |
26 | Develop |
[ios] 미스터피자(Mr.pizza) 어플
![]() |
hooni | 2013.04.23 | 42698 |
25 | PPT |
[android][ios] 알림(Notification) 기능에 대한 원리와 구현 방안 (APNS포함)
![]() |
hooni | 2013.04.23 | 37923 |
24 | Etc | [svn] 콘솔에서 svn 사용시 레티나용 이미지 add 안될 때.. | hooni | 2013.09.25 | 37655 |
23 | Develop |
[ios] iOS 4.0 beta 에서 3.1.3으로 다운그레이드 하는 법
![]() |
hooni | 2013.04.23 | 37544 |
» | Develop |
[ios] iOS 6.0 이상 회전 하기 (이전 버전과 비교 변경 부분)
![]() |
hooni | 2014.01.27 | 34244 |
21 | Develop |
[doc] Json Framework 설치와 사용
![]() |
hooni | 2013.04.23 | 21963 |