Contents

Atachment
Attachment '1'
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

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


?

List of Articles
No. Category Subject Author Date Views
841 Develop '2014 모바일 개발 트렌드' 발표자료입니다. file hooni 2014.10.02 976
840 Develop Aspect Oriented Programming in Objective-C hooni 2015.05.18 674
839 Develop DDay Memo 1.9.4 소스코드 secret hooni 2015.10.03 0
838 Develop GCM 사용하기 2 (단말에 GCM 구현하기) file hooni 2013.07.06 23248
837 Develop GCM 사용하기 3 (JSP로 GCM 푸시 서버 만들기) 4 file hooni 2013.07.06 25315
836 Develop git 브런치 배우기 (링크) hooni 2013.07.09 20571
835 Develop GPL, AGPL, MPL,.. 한눈에 보는 오픈소스SW 라이선스 file hooni 2014.10.14 1146
834 Develop How to Test SMTP AUTH using Telnet hooni 2018.04.05 1332
833 Develop JSON, BSON 변환 file hooni 2013.04.23 11814
832 Develop Laravel 5 Failed opening required bootstrap/../vendor/autoload.php hooni 2018.01.24 1652
831 Develop Mac OS 에 Jenkins 설치하기 (Homebrew) 2 file hooni 2017.03.15 8091
830 Develop macOS에 node, npm 설치하기 (homebrew) file hooni 2021.11.06 1139
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 71 Next
/ 71