2016-11-04 6 views
11

UIViewController에서 회전을 막으려 고 시도하고 있습니다.스위프트 3에서 shouldAutorotate가 작동하지 않습니다.

open override var shouldAutorotate: Bool { 
    get { 
     return false 
    } 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    get { 
     return .portrait 
    } 
} 

을 그리고 UIViewControler 스틸 사진은 회전 :

나는 이런 식으로 뭔가를하고 있어요. UIViewController는 모달로 열리는 UINavigationController 안에 있습니다.

여기에서 많은 질문을 보았습니다. 아무 답변도 저에게 효과적이지 않습니다.

스위프트 2에서는 shouldAutorotate을 오버라이드했지만 스위프트 3에서는 기능이 더 이상 존재하지 않습니다.

스위프트 2에서 내가했던 스위프트 3에서 어떻게 할 수 있습니까?

+1

'supportedInterfaceOrientations'의 모양은 무엇입니까? – matt

+0

@matt 질문을 편집하여 – pableiros

+0

감사합니다. 좋습니다. 제시된 뷰 컨트롤러라면 세로로만 나타나야합니다. 그런 일이 일어나지 않는다면 이야기에 더 많은 것이 있어야합니다. 이 뷰 컨트롤러가 어떻게 표시되는지 설명해 주시겠습니까? 그것이 전체 화면 최상위 레벨의 뷰 컨트롤러임을 입증 해주세요. – matt

답변

22

이 동작을 여러 번 재생할 수 있다면 왜 투표를 닫을 수 있는지 알 수 없습니다. UIViewController은 모달로 열어 UINavigationController 안에 있습니다.

이것은 내가이 문제를 해결하기 위해 수행 한 것입니다. 나를

+0

작동하지만 특정 UIViewController 원하는 경우 회전하지 않고 전체 탐색 스택이 아닌가? 이 대답은 더 나은 것 같다 : http://stackoverflow.com/a/39805665 –

+0

@RoyShilkrot 괜찮아요, 질문의 목표는 어떻게 내비게이션 컨트롤러 내에서 하나의보기 컨트롤러의 회전을 방지하는 것이 아니라 방지하는 방법 전체 탐색 스택 내의 특정 뷰 컨트롤러 – pableiros

3

AppDelegate에이 코드를 추가하기 위해 작동,

나는이 클래스를 생성하고 난 방지 할 UIViewController 그것을

class NavigationController: UINavigationController { 

    override var shouldAutorotate: Bool { 
     return false 
    } 

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     return .portrait 
    } 

} 

회전 그리고 그게 전부에이 (가) 포함되어 그 UINavigationController로 설정합니다. 빠른

var orientationLock = UIInterfaceOrientationMask.all 
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { 
    return self.orientationLock 
} 

struct AppUtility { 
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) { 
     if let delegate = UIApplication.shared.delegate as? AppDelegate { 
      delegate.orientationLock = orientation 
     } 
    } 

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) { 
     self.lockOrientation(orientation) 
     UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation") 
    } 
} 

는 방향을 강제 할의 ViewController에 추가

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    //let value = UIInterfaceOrientation.landscapeLeft.rawValue 
    //UIDevice.current.setValue(value, forKey: "orientation") 


    AppDelegate.AppUtility.lockOrientation(.landscapeLeft) 

} 
+0

이것은 나를 위해 작동하지만 수용된 대답은 훨씬 깔끔하고 작동합니다.수락 된 대답이 가능하지 않고이 방법 만 작동하는 특정 시나리오가 있습니까? – paul