【问题标题】:Hide UITabBar in landscape横向隐藏UITabBar
【发布时间】:2012-08-24 07:11:16
【问题描述】:

如何以编程方式隐藏 UITabBar?在 SO 上已被多次询问和回答,但答案似乎大致分为两种:

1) 使用导航控制器,可以使用 hidesBottomBarWhenPushed 属性在推送之前隐藏下一个 vc 的标签栏。 Typical answer here.

2) 浏览标签栏控制器的视图层次结构并修改标签栏的框架和/或可见性。 Typical answer here.

但是这两种答案都达不到要求,imo。 1)如果我们需要在我们所在的视图上隐藏标签栏怎么办,比如当旋转到横向时。 2)通过Apple库的私有视图层次结构唤醒的半页代码是a。笨重的湾容易发生不可预见的断裂,c。可能会阻止应用批准。

那么什么是应用程序呢?答案是不允许吗?是否有苹果文档参考支持这一点?这将是一个悲伤的答案。 Imo,旋转案例是隐藏标签栏的正当理由。

提前感谢您的帮助。

【问题讨论】:

  • 如果在我今晚下班时没有回答这个问题,我很乐意分享我的代码,它可以满足您的需求。我花了一些时间进行搜索,并进行了各种尝试以使其真正起作用。在我的应用程序中,我旋转到横向以隐藏选项卡栏和导航栏,并显示全屏地图 UI 元素。如果仍然需要,我会稍后发布。
  • 那太好了。谢谢。

标签: iphone ios uitabbarcontroller uitabbar


【解决方案1】:

您可以找到一些有用的代码here。你可以从你的 shouldrotate: 方法调用 hideTabbar

【讨论】:

  • 谢谢。是的,这是我发布的链接,作为一个不是特别好的解决方案的示例。
【解决方案2】:

很抱歉响应延迟,但我已经提取了我的代码,您可以看到我如何旋转我的设备以仅在横向模式下全屏显示“地图视图”。

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
    [self hideTabBar:self.tabBarController];
    [self.view bringSubviewToFront:self.eventsMapView];
    self.eventsMapView.bounds = self.view.bounds;
    self.eventsMapView.frame = CGRectMake(0, -208, self.view.frame.size.width, 300);
} else if(toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || toInterfaceOrientation == UIInterfaceOrientationPortrait) {
    [self showTabBar:self.tabBarController];
    [self.view sendSubviewToBack:self.eventsMapView];
}

}

由于我们调用其中的方法来实际隐藏和显示标签栏,我们还需要在 .m 文件中定义这些方法:

#pragma mark - Tab Bar Methods -

-(void)hideTabBar:(UITabBarController *)tabbarcontroller {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    for(UIView *view in tabbarcontroller.view.subviews) {
        if([view isKindOfClass:[UITabBar class]]) {
            [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
        } else {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
        }
    }

    [UIView commitAnimations];   
}

-(void)showTabBar:(UITabBarController *)tabbarcontroller {       
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    for(UIView *view in tabbarcontroller.view.subviews) {
        if([view isKindOfClass:[UITabBar class]]) {
            [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];
        } else {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
        }
    }

    [UIView commitAnimations]; 
}

如果您已经在 Tab Bar Controller 中,那么您需要确保每个子项(或单个选项卡 ViewController)返回 TRUE 以获取如下方向。

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return TRUE;

}

希望这会有所帮助 - 如果您有任何问题,请发表评论,我会更新我的答案以更好地展示它。

【讨论】:

  • +1 用于分享一个可行的答案,但我认为它属于我提到的第二类不充分的解决方案,因为它直接操纵系统的私有层次结构。谢谢!
  • 如果您愿意直接触摸标签栏,这里有一些改进您发​​布的代码的建议: 1)在没有搜索的情况下获取 tabBar - 您可以从包含的视图控制器中说:tabBar = self.tabBarController.tabBar。 2) 使用 [UIView animateWithDuration... 方法来获得更清晰的动画代码,3) 避免像这样的框架中的文字浮动:tabBar.frame = CGRectOffset(tabBar.frame, 0.0, sign*tabBar.frame.size.height);其中符号是 +1 隐藏和 -1 显示。
【解决方案3】:

2021 年的答案。 Xcode 12. 在横向模式下创建新布局。在下图中,我创建了 wAny hCompact (hC) 属性,然后将其设置为隐藏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多