2010-05-17 3 views
2

내 iPhone 응용 프로그램이 회전 할 때 이상한 동작을 보이고 있습니다. 탐색 제목과 내용보기 사이에 탭 막대보기 (아래에서 재현하는 방법에 대한 자세한 내용)가 나타납니다. 동일한 문제를 보여주는 작은 테스트 케이스를 만들었습니다 : 사용자 지정 루트 UIViewController는 UITabBarController를 프로그래밍 방식으로 만들고 표시합니다. 프로그래밍 방식으로 두 개의 탭이 있습니다 : 1) 일반 UIViewController 및 2) UINavigationController는 프로그래밍 방식으로 단일 일반 UIViewController 콘텐츠 뷰로 만들어졌습니다. .회전 및 탭 전환 후 내비게이션 막대와보기 사이에 틈이 생깁니다.

응용 프로그램의 전체 코드는 루트 컨트롤러의 viewDidLoad에 있습니다 (모든 "* VC"클래스는 Xcode에서 사용자 인터페이스를위한 XIB로 완전히 바닐라 UIViewController 하위 클래스이며보기 배경색 만 변경되어 각보기를 명확하게 식별합니다. 아무것도).

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    FirstVC *fvc = [[FirstVC alloc] initWithNibName:@"FirstVC" bundle:nil]; 
    NavContentsVC *ncvc = [[NavContentsVC alloc] initWithNibName:@"NavContentsVC" bundle:nil]; 
    UINavigationController *svc = [[UINavigationController alloc] initWithRootViewController:ncvc]; 

    NSMutableArray *localControllersArray = [[NSMutableArray alloc] initWithCapacity:2]; 
    [localControllersArray addObject:fvc]; 
    [localControllersArray addObject:svc]; 

    fvc.title = @"FirstVC-Title"; 
    ncvc.title = @"NavContents-Title"; 

    UITabBarController *tbc = [[UITabBarController alloc] init]; 
    tbc.view.frame = CGRectMake(0, 0, 320, 460); 
    [tbc setViewControllers:localControllersArray]; 
    [self.view addSubview:tbc.view]; 

    [localControllersArray release]; 
    [ncvc release]; 
    [svc release]; 
    [fvc release]; 
} 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 
다음

문제를 재현하는 방법은 다음과 같습니다 : 여기

가있는 viewDidLoad 코드 및 shouldAutorotateToInterfaceOrientation 코드입니다,이 코드는 기본적으로 전체 응용 프로그램입니다

1) 시작 응용 프로그램은

2) (UITabBar가 올바르게 회전 함)

3) 탭 2를 클릭하십시오.

4) 장치를 세로 방향으로 회전합니다. 탐색 제목 표시 줄과 탐색 내용보기 아래에있는 루트보기 컨트롤러의 배경색이 약 10 픽셀 높습니다.

5) 탭 1

6)을 클릭 탭 2

와의 격차를 클릭 사라 졌어요! 내 실제 응용 프로그램에서 NavigationController 탭이 활성화되어있는 동안 모든 VC 푸시 및 팝 중에 간격이 유지되는 것을 볼 수 있습니다. 다른 탭으로 이동 한 다음 탐색 탭으로 돌아가서 간격을 정리합니다.

내가 뭘 잘못하고 있니? SDK 3.1.3에서 실행 중이며 시뮬레이터와 장치에서 모두 발생합니다. 이 특정 시퀀스를 제외하고 모든 것이 잘 작동하는 것 같습니다. 도움!

답변

2

이 문제는 다른 UIViewController (이 경우 UITabBarController) 내에 UINavigationController를 중첩 할 때 발생합니다. UINavigationController를 루트보기 컨트롤러로 사용했다면이 문제는 발생하지 않습니다.

한 가지 해결 방법은 탐색 모음의 프레임을 변경하고 y 원점을 0에서 20으로 설정하는 것일 수 있지만 문서에서 명시 적으로이를 수행하지 않도록 명시하고 있습니다. 그래서 나에게 이것은 UINavigationController를 중첩하는 것이 좋은 UI로 간주되지 않는다는 표시입니다.

감사 인사를 전합니다. 감사합니다. :)

+0

어느 쪽이든, 또는 문제가 UITabBarController가이 아니라고 루트 컨트롤러 자체. 나는 "커스텀"루트 뷰 컨트롤러를 사용하는 로테이션에 많은 문제를 겪었다. 이후 그 일을 중단하고 UITabBarController 또는 UINavigationController를 내 응용 프로그램의 주 루트 컨트롤러로 사용하고 "특수"시작 화면을 애니메이션없이 "즉시"팝업하는 모달 VC로 구현했습니다. 애니메이션으로 해산. – Bogatyr

0

해결 방법은 어떤 계기로 작동합니다

회전 후, 내비게이션 바의 새로 고침을 강제하기 때문에 해당 뷰의 프레임이 제대로 크기가 조절됩니다.이 같은 일부 코드 :

  • (무효) didRotateFromInterfaceOrientation : (UIInterfaceOrientation) fromInterfaceOrientation

{

// if _navigationController is showing 
[_navigationController setNavigationBarHidden:YES]; 

[_navigationController setNavigationBarHidden:NO]; 

}