iOS에서 Landscape 모드만 지원

iOS 앱에서 랜드스케이프 모드만 지원해야 했습니다. Xcode에서 대상을 선택하고 장치 오리엔테이션을 Landscape LeftLandscape Right로 지정합니다.



다음에, UIWindow 의 root view controller 이 경우 UINavigationController 의 서브 클래스 MyNavigationController 라든가를 준비해, 다음의 메소드를 오버라이드(override) 합니다. Landscape 모드만이라든지 말하면서, 실레와, topViewControllersupportedInterfaceOrientations 를 묻고 그것을 돌려줍니다.

MyNavigationController.swift
class MyNavigationController: UINavigationController {
    // ...
    override var shouldAutorotate: Bool {
        return true
    }
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return self.topViewController?.supportedInterfaceOrientations ?? .landscape
    }
    // ...
}

그리고 navigation view controller 의 root view controller 에도 이런 식으로 메소드를 오버라이드(override) 합니다.

MyViewController.swift
class MyViewController: UIViewController {

    override var shouldAutorotate: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscape
    }

}

그런데, 실행해 보면, iPhone에서는 랜드스케이프 고정이 됩니다만, iPad에서는 View가 landscapeportrait에 회전이 일어나 버립니다. Stack Overflow 를 조금 검색해도, 대체로 이 근처에서 좋은 것들이 써 있었습니다. Application Delegatefunc application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask 를 구현하면 된다고 하는 쓰기가 있었습니다만, 원래, iPad 에서는 그것조차 불리지 않습니다.

포기하고 공개 질문을 만드는 느낌으로, 검증용 프로젝트를 만들어GitHub에 공개할 생각으로 준비를 시작했습니다.

이것이 검증 프로젝트입니다. iPad에서는 회전해 버리는 상태로 공개되고 있습니다.
htps : // 기주 b. 코 m / 코 ly x x / 엔 r 후세 오리 엔타치 온 - 2018

그런데 이것을 준비하는 동안 대답을 찾아 버렸습니다. 어떤 검색 키워드를 사용했는지 기억하지 못하지만 검색 키워드에서 결과가 크게 다른 것은 조금 아프다.

SupportedInterfaceOrientations not called in iPad

If 'Requires full screen' setting from 'General' is enable, will allow the orientation delegate methods shouldAutorotate, preferredInterfaceOrientation, and supportedInterfaceOrientations to fire.

결과에서 말하면, info.plistRequire full screenon 로 해 두면, 제대로 iPad 에서도 supportedInterfaceOrientations 가 불리게 되었습니다.



대신 multitasking 기능을 사용할 수 없다는 이야기도 있지만, 게임이나 일부 앱 등 어른의 사정으로 랜드스케이프 고정이 바람직한 앱도 있으므로, 그 경우는 이 방법으로 괜찮은 것 같습니다.

시도하지는 않지만 portrait 고정의 경우에도 마찬가지입니다.

쓰기 시 Xcode와 Swift 버전은 다음과 같습니다.
Xcode Version 9.2 (9C40b)
Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
Target: x86_64-apple-macosx10.9

좋은 웹페이지 즐겨찾기