0

가로보기에서 세로보기로 UINavigationController (하위 클래스)을 터뜨리는 데 문제가 있습니다.popViewControllerAnimated : 가로 방향에서 세로 방향

은 내가 windowrootViewController 내가 제시 개별 뷰 컨트롤러까지 shouldAutorotatesupportedInterfaceOrientations를 사용 설정 체인을 가지고있다.

그래서 저는 세로 만 지원하는보기 컨트롤러가 있습니다. 푸시 된 다음 것은 가로도 지원합니다.

가로를 지원하는 장치를 누른 다음 장치를 돌리면 모든 것이 회전합니다. 여태까지는 그런대로 잘됐다.

이제 첫 번째 팝업으로 되돌아 가면 두보기가 모두 애니메이션보다 먼저 회전합니다. 따라서 두 번째 viewController의 가로보기 (회전 변환으로 인해 실제로 작음)가 세로보기의 오른쪽으로 밀려납니다.

본인은 세로보기 컨트롤러가 배경에 표시되는 동안 가로보기가 오른쪽 (세로보기 컨트롤러의 상단 또는 하단), 멀리 밀어 싶다.

어떻게하면됩니까?

애니메이션 컨트롤러를 사용하려고 시도했지만 의 대리자 메서드 인 navigationController:animationControllerForOperation:이 다른 방향으로 View Controller로 이동할 때 호출되지 않습니다.

답변

0

실험의 날 이후에 나는 내 문제가 무엇인지 알아 냈습니다. 바라기를 이것은 미래에 누군가를 도울 것입니다.

저는 체인을 과도하게 설계하려고했습니다.

다른 방향 요구 사항이있는보기 컨트롤러가 포함 된 여러 네비게이션 컨트롤러가 포함 된 하위 탭 표시 줄 컨트롤러가있는 사용자 지정 컨테이너가 있습니다.

내 단점은 모달 윈도우가 표시 되더라도 시스템은 여전히 ​​윈도우의 루트보기 컨트롤러를 먼저 요구한다는 것입니다. 이것은 기본적으로 두 가지 방법으로 내 문제의 원인이되었다, 그러나

- (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
    if (self.presentedViewController) { // This check is wrong! Don't do this! 
     return [self.presentedViewController supportedInterfaceOrientations]; 
    } 

    // Pass request to child view controller 
} 

:이 상황을 설명하기 위해 나는이처럼 보였다 용기에 체크를 추가했다.

먼저이 검사를하지 않으면 UIKit이 모달 뷰 컨트롤러를 자동으로 감지하여 해당 supportedInterfaceOrientations을 직접 요청합니다.

둘째, UIKit에서 애니메이션을 처리하는 방식에는 일반적으로 존재하지 않는 몇 가지 내부보기 컨트롤러가 포함됩니다. 모달 뷰 컨트롤러가 presentingViewController 인 지 확인하면이 체크가 캐치되어 모두 supportedInterfaceOrientations에 대한 질문입니다. UIKit은 이런 식으로 동작하지 않으므로 작업을 방해하는 사람이었습니다.

수정 사항은 supportedInterfaceOrientations을 구현하여보기 컨트롤러의 직접 자손 (즉, 현재보기 컨트롤러의보기 계층에서 자손 인 view 인보기 컨트롤러)에만 해당됩니다. 직계 자손은 거기에서 요청을 더 통과시킬 수 있습니다.

발표자와 관계없이 모달 창을 완전히 다른 체인으로 처리하십시오.

즉, trust UIKit.

관련 문제