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
81 Develop [ios] 아이폰 앱 이름 및 버전 정보 hooni 2015.03.24 976
80 System/OS [macos] How to Fix ‘You Shut Down Your Computer Because of a Problem’ file hooni 2022.06.01 975
79 Develop [c] 기막힌 정렬 코드 ㅋㄷ file hooni 2015.10.13 970
78 Develop [git] 쉬운 버전관리 Git 설명 hooni 2015.08.18 966
77 Develop [android] N-Puzzle 게임 file hooni 2015.07.09 963
76 Develop [ios] NSString, RegularExpression Find/Replace hooni 2017.04.14 961
75 Develop [android] Android N requires the IDE to be running with Java 1.8 or later 오류 hooni 2016.08.30 957
74 Algorithm OCB5 Injection 앗싸뵹! ㅋㅋ file hooni 2014.07.01 956
73 Etc 사이버보안실무 수업 메모 hooni 2017.03.30 952
72 Develop Aspect Oriented Programming in Objective-C hooni 2015.05.18 951
71 Develop [ios] iOS 앱 아이콘을 만드는 유틸 file hooni 2015.01.03 949
70 Develop [io] Apple Watch, Today Extension 앱ID 설정 hooni 2016.04.20 947
Board Pagination Prev 1 ... 87 88 89 90 91 92 93 94 95 96 ... 98 Next
/ 98