[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 |
---|---|---|---|---|---|
49 | Develop |
[jsp][php] 간단한 강좌 자료..
![]() |
hooni | 2003.04.23 | 8158 |
48 | Develop |
[c] flooding 알고리즘 미로 찾기(도스용) 소스코드
9 ![]() |
hooni | 2003.04.23 | 12608 |
47 | Develop |
[c] 테트리스(Tetris) 게임(도스용) 소스코드
![]() |
hooni | 2003.04.23 | 11528 |
46 | Develop |
[c] 파일입출력, 링크리스트(linked list)를 이용한 주소록(도스용) 소스코드
1 ![]() |
hooni | 2003.04.23 | 11199 |
45 | Develop |
[c] 간단한 자료구조(stack, queue, linked list) 구현 소스
6 ![]() |
hooni | 2003.04.23 | 10172 |
44 | Develop | [unix] 쉘 스크립트 예제 모음 | hooni | 2003.04.23 | 15016 |
43 | Develop | [linux] 쉘 스크립트를 이용한 BBS | hooni | 2003.04.23 | 10084 |
42 | Develop | [c] pcap을 이용한 패킷 분석 ㅎㅎ | hooni | 2003.04.23 | 10255 |
41 | Develop | [js] 스크롤을 포함한 마우스 위치 찾는 코드 | hooni | 2003.04.23 | 8552 |
40 | Develop | [js] 쿠키(cookie)에 대한 설명과 예제.. | hooni | 2003.04.23 | 8359 |
39 | Develop | [php] URL/URI 관련 환경변수 | hooni | 2003.04.23 | 9225 |
38 | Develop | [js] 자바스크립트로 응용프로그램 실행 ㅎㅎ | hooni | 2003.04.23 | 9857 |