2011-09-27 2 views
4

시각적으로 이것은 내가 원하는 것입니다.

나는 UITabBarController입니다. 사용자가 가운데 탭을 입력하면 UITabBar을 숨기려고합니다. 가운데 탭은 B 클래스의 뷰 컨트롤러를로드합니다. 이것은 인기있는 카메라 앱인 Instagram의 동작입니다. 중간 탭은 전체 화면 카메라를로드합니다. 우리는 이미 특정 뷰 컨트롤러가 밀어 때의 UITabBar을 숨기는 방법에 대한 질문 수십있는 모든 다른 관련 StackExchange 질문 하위 클래스를 만들지 않은 UITabBarController에서 UITabBar를 숨기는 방법은 무엇입니까?

에서

------------- ------------- ------------- 
|  VC | |  VC | |  VC | 
| for | | for | | for | 
|  A  | |  B  | |  C  | 
|   | |   | |   | 
|------------ |   | |------------ 
{ A } B | C | |   | | A | B { C } 
------------- ------------- ------------- 

제안 된 솔루션을 제공합니다. 일반적인 합의는 다음과 같습니다.

b.hidesBottomBarWhenPushed = YES; 
[self.navigationController pushViewController:b 
            animated:YES]; 

내 문제는 UITabBarController를 서브 클래 싱 한 적이 없다는 것입니다. 인터페이스 빌더에서 만들었습니다. 위의 솔루션은 나를 위해 작동하지 않습니다. 내 중간 뷰 컨트롤러 내부

실패 시도 1

, 나는 생성자에서 hidesBottomBarWhenPushed를 켭니다. 이것은 아무런 효과가 없었다.

@implementation B 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     self.hidesBottomBarWhenPushed = YES; 
    } 
    return self; 
} 

실패 시도가 2

나는 또한 UITabBarControllerDelegate로 내 응용 프로그램 대리자를 지정했습니다. UITabBarController가 탭이 탭되었다는 것을 알리면 중간 뷰 컨트롤러에 대해서만 hidesBottomBarWhenPushed을 켭니다. 이것은 또한 UITabBar을 숨기지 못했습니다.

#pragma mark UIApplicationDelegate 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    [window addSubview:self.rootViewController.view]; 
    [window makeKeyAndVisible]; 
    self.rootViewController.delegate = self; 
} 

#pragma mark UITabBarControllerDelegate 

- (void) tabBarController:(UITabBarController *)tabBarController 
didSelectViewController:(UIViewController *)viewController 
{ 
    if ([viewController isKindOfClass:[B class]]) { 
     viewController.hidesBottomBarWhenPushed = YES; 
    } else { 
     viewController.hidesBottomBarWhenPushed = NO; 
    } 
} 
+2

그러나 당신은 그것을 서브 클래스 화해, IB는 클래스의 인스턴스를 반환 할 수 있습니다. – Krumelur

답변

0
- (void) hidetabbar:(BOOL)hiddenTabBar 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    for(UIView *view in self.uiTabBarController.view.subviews){ 
     if([view isKindOfClass:[UITabBar class]]) { 

      if (hiddenTabBar) { 
       [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)]; 
      } else { 
       [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)]; 
      } 
     } else { 
      if (hiddenTabBar) { 
       [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)]; 
      } else { 
       [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)]; 
      } 
     } 
    } 
    [UIView commitAnimations]; 
    hiddenTabBar = !hiddenTabBar; 
} 
+0

이 코드는 어디에 배치됩니까? UITabBarController 객체에 액세스 할 수있는 유일한 장소는 App Delegate입니다. App Delegate에는 코드에서 사용하려고하는 뷰 속성이 없습니다. /// 나는 그것을 더 깨끗한 방식으로하는 방법을 알아 냈다. 나는'tabBarController.tabBar.hidden = YES;'를 수행하지만, 탭 바가 있어야했던 공백이 있습니다. 그래서 내가 밀어 넣은보기 컨트롤러보기의 프레임을 320 x 480 수 있도록 설정했지만 아무것도 않았다. 그래서 나는이 해킹에 대해 읽었다 :'[tabBarController.view addSubview : viewController.view]', 어떤 종류의 작품. 너무 털이 많아지고있어. – JoJo

+0

이 코드를 사용하여 X 클래스에 tabBarController ivar를 만들 수 있습니다. 그런 다음 MainWindow.xib에서 uiviewcontroller 아이콘을 놓고 클래스를 X로 설정하고 ivar를 UITabBarController에 연결합니다. 이 코드는 tabbar를 움직여야합니다. 어쨌든, 그것을 할 수있는 한 가지 방법 일뿐입니다. – Jano

관련 문제