문제

업데이트 :이 질문에 대한 내 대답을 먼저 참조하십시오. 이것은 버그 인 것 같습니다. 최소한의 테스트 사례가 작성되었으며 Apple에 보고서가 제출되었습니다. (iPhone OS 3.1로 수정)

여기에 "너무 가까워요!"의 퍼즐 러가 있습니다. 학과.

탭 바 기반 iPhone 앱이 있습니다. 각 탭에는 a가 있습니다 uinavigationcontroller 일반적인 용의자 (Nav Bar, 테이블보기 ... 다른 VC 등으로 이어질 수 있음).

이제 그 하위 수준 VC 중 하나는 Portait에서 사용됩니다. 그리고 조경 모드. 그러나 문제가 있습니다. 우리의 풍경 친화적 인 VC DistAutorotateTointerfaceorientation : 상자 밖으로 전화를 걸지 않을 것입니다! 무엇을해야합니까?

여기에 우리가하는 일이 있습니다. 자체 파일로 구현 한 탭 바 컨트롤러에서 다음과 같습니다.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

이것은 내 조경 친화적 인 VC에 대한 요청을 전파하며,이 메시지에도 응답합니다. 내 다른 모든 VC는이 방법을 구현하지 않으므로 기본 초상화 방향을 사용합니다.

문제 해결됨!!! 예!

잘, 좀 빠지는. :(

내 조경 친화적 인 VC가 탭 바 컨트롤러의 깊이 내에서 호출 될 때 상황이 잘되지 않는 것 같습니다. MorenavigationController.

나는 중 하나에서 호출 된 VC를 비교/대비하기로 결정했습니다. 처음 네 탭 바 uinavigationcontrollers ... 그리고 그 내에서 동일한 VC가 호출되었습니다 MorenavigationController. 이것은 약간 끔찍할 것입니다. 그래서 저와 함께하십시오. 잘만되면 플레이로 연극이 물건을 끄는 데 유용합니다.

앱이로드되면 탭 바 컨트롤러의 DistAutorotate ... 메소드에 몇 가지 초기 호출이 있습니다. 이 초기의 경우 selectedViewController nil입니다. 그러나 결국로드가 끝나고 초기 탭 항목이 선택되며 모든 것이 잘됩니다.

오른쪽. 먼저, 처음 4 개의 탭 막대 항목 중 하나를 선택하고 VC로 드릴 다운합시다.

세 번째 NAV 막대 항목을 선택하겠습니다. 그래서 이것이 세 번째 NAV 컨트롤러입니다. 회전을 지원하는 VC로 드릴 다운합니다. 빠른 검사를 통해 부모가 실제로 탭 바의 뷰 컨트롤러 목록에서 세 번째 NAV 컨트롤러임을 확인합니다. 좋은!

장치를 회전합시다. 탭 막대 컨트롤러는 자동으로 테이트를 요청합니다 (위 코드 참조). 우리는 그것을 관찰합니다 selectedViewController 또한 세 번째 NAV 컨트롤러와 NAV 컨트롤러의 상단 및 가시 뷰 컨트롤러는 회전을 지원하는 신뢰할 수있는 VC로 설정되어 있습니다.

따라서 탭 막대 컨트롤러가 전달됩니다 타율 세 번째 NAV 컨트롤러로의 메시지 ...하지만 회전 친화적 인 VC가 궁극적으로 메시지를받습니다. (나는 여기서 특별한 일을하고 있지 않습니다. 원하는 VC가 상단 및/또는 가시적 인 VC이기 때문에 메시지를받을 수 있습니까?) 어쨌든, 우리는 풍경으로 회전하고, 사물이 크기를 조정하고, 모든 것이 잘됩니다. "훌륭한 성공!"

이제 뒤로 버튼을 누르고 VC 스택을 팝업하여 프로세스에서 조경 모드를 남겨 두겠습니다. 탭 막대 컨트롤러가 다시 쿼리됩니다.

여기서 조금 옆으로 시간을 할애 할 시간. 그만큼 TopViewController NAV 컨트롤러는 여전히 회전 친화적 인 VC이지만 VisibleViewController 이제 설정되었습니다 UISNAPSHOTMODALVIEWCONTROLLER! heh. 전에는 이것을 본 적이 없지만 ...하지만 Erica Sadun이 있습니다. "사라지는보기 컨트롤러"를위한 것 같습니다 (이 경우 확실히 사실입니다. 괜찮습니다).

계속 진행하면서 보이는 VC는 스냅 샷으로 유지되지만 상단 VC는 결국 특별한 VC가 사라 졌기 때문에 스택의 다음 VC로 변경됩니다. 그럴 수 있지.

그래서 그게 모든 것이 잘 작동하는 시나리오.

이제 같은 테스트를 시도해 봅시다. 이번에는 우리가 MorenavigationController (더 많은 탭 막대 항목) 및 이전과 동일한 VC 클래스로 드릴 다운하십시오. 필자의 경우 Tab Bar Controller의 VC 목록에서 7 번째입니다.

우리는 회전 인식 VC에 들어가고 ... 이번에는 회전하도록 요청받습니다. 곧장! 탭 막대 컨트롤러는입니다 ~ 아니다 전혀 회전 할 수있는 권한을 요청했습니다. 흠.

부모 VC의 빠른 점검은 MorenavigationController. 좋아요, 그건 말이됩니다.

이제 장치를 회전시켜합시다. 아무것도 호출되지 않습니다. 우리의 중단 점 중 어느 것도 치지 않습니다. 우리 VC에는 없습니다. 탭 바 컨트롤러가 아닙니다. (뭐?!?!)

O-KAAAAY. 스택을 터뜨리고 동일한 VC로 돌아가서 다시 회전하십시오. 기이한. 이제 탭 바 컨트롤러에서 자동화 권한을 요청하는 전화를받습니다. 여기서 선택한 컨트롤러는 신뢰할 수있는 NAV 컨트롤러 (#7)이지만 이번에는 VisibleViewController 그리고 TopViewController ~이다 nil로 설정하십시오!

여기에서 계속되면 디버거 콘솔에 신비한 메시지가 나타납니다.

2 단계 회전 애니메이션 사용. 더 부드러운 단일 단계 애니메이션을 사용하려면이 응용 프로그램은 2 단계 방법 구현을 제거해야합니다.

신비한 일입니다 2 단계 회전 애니메이션을 사용하지 않습니다! 아니 후손 메소드 변형은 내 소스 코드의 어느 곳에서나 재생됩니다.

아아, 내 회전 인식 VC는 회전이 발생한다고 말하지 않았으므로 (회전이 화면에서 회전이 발생하더라도) 물론 내 견해는 결과적으로 모두 파울됩니다. 신체 상해와 슬픔이 계속됩니다. :(

우리는이 시점에서 스택을 터뜨리는 것을 귀찮게하지 않을 것입니다.

View Controller Doc은 가능한 문제를 힌트합니다.

오리엔테이션 변경 중에 사용자 정의 애니메이션을 수행하려면 두 가지 방법 중 하나로 수행 할 수 있습니다. 방향 변경은 두 단계로 발생했으며, 회전의 시작, 중간 및 종말점에서 알림이 발생합니다. 그러나 iPhone OS 3.0에서는 한 단계에서 오리엔테이션 변경을 수행하기위한 지원이 추가되었습니다. 1 단계 방향 변경을 사용하는 것은 이전 2 단계 프로세스보다 빠르며 일반적으로 새로운 코드에 권장됩니다.

나는 궁금 MorenavigationController 여전히 2 단계 프로세스에 응답하고 있으며, 따라서 1 단계 프로세스를 사용하려는 시도를 중단하고 있습니까? 2 단계 메시지에 응답하면 1 단계 변형이 작동하지 않습니다 (다시 문서에 따라). 나는 그들에게 응답하지 않지만, 비하인드 스토리가있는 것에 대한 의심이 있습니다.

사실, 단일 단계 방법을 언급하고 응답하려고합니다. Willanimatesecondhalfofrotationfrominterfaceorientation : 지속 시간 :, 나 하다 메모를 얻으십시오! 그러나 여전히 스택을 매우 깨끗하게 튀어 나오지 않습니다 (시각적 측면에서). 심지어 낯선 사람 : WillanimateFirsthalfofrotationfrominterfaceorientation : 지속 시간 : 내가 자신에게 전화를 걸려고했을 때조차 (Firsthalf 메시지 사용) DistAutorotateTointerfaceorientation :. 내가 그것을 정의 한 적이없는 것처럼 흔적 중에 즉시 돌아옵니다. 한숨을 쉬다.

이것이 바로 플레이 바이 플레이입니다.

요약하면 누구나 탭 바 컨트롤러의 MorenavigationController 내에서 호출 된 VC의 1 단계 장치 회전을 성공적으로 처리 했습니까? 질문을 묻는 마음은 알고 싶어합니다!

도움이 되었습니까?

해결책

Apple은 Uitabbarcontroller 서브 클래스에 대해 조언하므로 대신 카테고리를 사용하여 자동 장애를 처리하는 쉬운 방법을 찾았습니다. 더 많은 뷰 컨트롤러로 버그를 해결하지는 않지만 작업을 완료하는 데 더 친숙한 방법이라고 생각합니다 (그리고 서브 클래싱이 적다는 것을 의미합니다).

내 응용 프로그램의 모든 탭을 올바르게 자동으로 만들기 위해 -houldautorotateTointerfaceorientation : 내 사용자 정의 뷰 컨트롤러에서 모두 UITABBARCONTROLLER 내의 UinaVigationControllers 내부에 있으므로 메시지가 내 VC로 전송되지는 않습니다. 또한 응답합니다. 그래서 앱 대의원 파일에 다음 줄을 추가했습니다.

MyAppDelegate.h의 바닥에 추가되었습니다

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

myAppDelegate.m의 바닥에 추가되었습니다

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

다른 팁

버그가있는 것 같습니다. 재현 가능한 최소 테스트 케이스를 만들어 Apple Bug Reporter를 통해보고했습니다.레이더 문제 7139857).

업데이트 : 이것은 iPhone OS 3.1로 고정되었습니다.

필수 문제는 다음과 같습니다.

탐색 컨트롤러 스택에서 이미 컨트롤러보기가 수신되지 않습니다. Willanimaterationtoininterfaceorientation : 지속 시간 :메시지 탭 바 컨트롤러의 '더 많은 탐색 컨트롤러'가 사용중인 경우 메시지.

이 문제가 있습니다 ~ 아니다 탭 막대 항목보기 컨트롤러가 기본 뷰 컨트롤러 일 때 발생합니다. 내비게이션 컨트롤러 일 때만 "더 많은"내비게이션 계층 구조가 사용되는 경우.

콘솔 메시지 (2 단계 회전 애니메이션 관련)는 프레임 워크 (더 많은 탐색 컨트롤러?) 내에서 싱글 스테이지가 iPhone OS 3.0으로 권장 되더라도 여전히 2 단계 애니메이션을 사용하고 있음을 시사합니다.

그 이유를 설명 할 수 있습니다 WillAnimaterationToInterfaceorientation : 특정 경우에 호출되지 않습니다. Apple의 View Controler 문서에 따르면,이 메시지는 2 단계, 제 1 회 반 오리엔테이션 메시지가 대신 응답 될 때 호출되지 않습니다.

약간 수정 된 버전 Victorb의 대답 모든 단일보기 컨트롤러가 회전 허용 여부를 결정할 수 있습니다.

여기에서 쉽게 복사하고 포킹을위한 요점으로

AppDelegate.h

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

AppDelegate.m

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    UIViewController *selectedVC = [self selectedViewController];
    if ([selectedVC respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) {
        return [selectedVC shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }

    //optimistic return - if you want no rotation, you have to specifically tell me!
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    UIViewController *visibleVC = [self visibleViewController];
    if ([visibleVC respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) {
        return [visibleVC shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }

    //optimistic return - if you want no rotation, you have to specifically tell me!
    return YES;
}
@end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top