티스토리 뷰

일반적으로 앱을 실행한 후 

휴대폰을 가로나 세로로 회전하는 경우

화면이 자동으로 돌아가시는 걸 많이 보셨을겁니다.

 

하지만 자동으로 회전하다보면 화면이 이상하게 나오는 경우도 많고 

원하는 기능을 사용할때 불편할 수 있기 때문에 

오늘은 화면을 회전하지 못하게 막는 방법을 올려볼까합니다.

 

일단 테스트를 위해 간이 프로젝트를 만들었습니다. 

뷰는 총 3개로 되어있고 각 뷰의 구분을 위해 바탕색을 다르게 했습니다. 

 

저는 대략 이런식으로 만들었습니다.

 

* 고정 전 모습 *

아직 고정 전이라 회전하는게 보이시나요?

1. 전체 고정하기 

정지화면 아닙니다.고정되서 그래요.

* AppDelegate 에 아래 부분을 추가해주세요.*

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    .
    .
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        //이 함수를 추가해주세요.
        // 세로방향 고정
        return UIInterfaceOrientationMask.portrait
    }
    .
    .
}

원하시는 방향으로 넣어주시면 됩니다. 

- UIInterfaceOrientationMask.landscape : 가로로 고정 (동영상 볼때 생각하면 편해요)

- UIInterfaceOrientationMask.portrait : 세로로 고정 (일반적인 모양)

- UIInterfaceOrientationMask.all : 자동 회전 (모든 방향 가능)

 

2. 부분 고정 혹은 예외 설정 

하시다보면 고정을 풀거나 특정 화면만 예외로 하고 싶은 경우가 있습니다. 

 

예를 들어 저는

노란 화면(HorizViewController)은 가로로 고정하고 

보라색 화면(VerticalViewController)은 세로로 고정하고 

그 외의 화면은 회전이 가능하게 만들겠습니다. 

 

이 경우 아래처럼 시도할 수 있습니다. 

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    if let viewController = window?.rootViewController?.presentedViewController{
        if(viewController.isKind(of: HorizViewController.self)){
            return UIInterfaceOrientationMask.landscape // 가로 고정
        }
        if(viewController.isKind(of: VerticalViewController.self)){
            return UIInterfaceOrientationMask.portrait //세로 고정
        }
    }
    // 다른 뷰는 자동회전 허용
    return UIInterfaceOrientationMask.all
}

실제로 코드를 실행해보면 아래처럼 잘 작동하는걸 알 수 있습니다.

움직이시는게 보이시나요?

 

화면을 고정하는 부분은 많이 올라와 있긴 하지만 

특정 화면의 회전을 풀거나 제한하는 부분은 찾기 힘들더라고요.

(사실 그냥 간단히 생각하면 되는거였는데...)

그래서 한번 정리해서 올려봅니다. 

 

오늘도 파이팅입니다. 

 

* 참고

나는 그런거 복잡하게 코드 필요없고 모든 화면을 간단히 고정하고 싶다 

하시는 분들은 

Project > Targets > General > Deployment Info 에서 체크 해제 해주시면 됩니다.

간단하죠?

댓글