【问题标题】:UITabBar leaves a white rectangle when hiddenUITabBar 隐藏时留下一个白色矩形
【发布时间】:2011-01-26 10:37:53
【问题描述】:

我无法在谷歌上找到可以应用于我的项目的可接受的解决方案。

我的应用程序是一个具有三个选项卡的绘图工具;一个用于图形本身,另外两个用于可添加到图形中的内容的浏览/搜索功能。所有选项卡都是导航控制器。

图表本身的选项卡在纵向模式下显示图表的小预览并列出下方图表上每个实体的详细信息,并在底部显示选项卡栏。

当用户旋转到横向模式时,图表会变成全屏,其他所有内容(包括标签栏)都会消失。这就是我遇到问题的地方,因为我的图表的 GLView 总是被标签栏所在的白色矩形遮挡。

我尝试将导航控制器视图的大小更改为全屏,将标签栏控制器视图的大小更改为全屏,将标签栏本身的框架大小更改为 CGRect(0,0,0, 0)、情绪失控、用拳头敲桌子、对着 MacBook 大喊辱骂等;都无济于事。

我怎样才能让它工作?

【问题讨论】:

  • 五年后,仍然没有不需要对矩形进行硬编码的体面解决方案?你有想过这个吗?在 iOS 9 上仍然是一个问题,显然......
  • 顺便说一句,这是最好的答案:stackoverflow.com/a/4242817/363789

标签: iphone objective-c uitabbarcontroller hidden uitabbar


【解决方案1】:

对于那些仍在为此苦苦挣扎的人。我发现问题在于约束。 Tab Bar 已隐藏,但它已经改变了我对 Storyboard 的约束。

SWIFT 3+

self.tabBarController?.tabBar.isHidden = true

let cons = NSLayoutConstraint(item: textview, attribute: NSLayoutAttribute.bottom,
         relatedBy: NSLayoutRelation.equal, toItem: self.view, 
         attribute: NSLayoutAttribute.bottom, multiplier: 1.0, constant: 0)

view.addConstraints([cons])

在我的例子中,“textview”是项目,它应该从隐藏的 TabBar 中填充空白。

【讨论】:

    【解决方案2】:

    注意 - 此解决方案只是删除隐藏标签栏后留下的空白。

    隐藏标签栏的最佳解决方案是 - @Michael Campsall answer here

    对此最简单的解决方案是更改您的视图(在我的情况下是它的 tableView)底部约束,而不是使用 BottomLayoutGuide 提供底部约束,而是使用 superview 赋予它。附上截图供参考。

    下面截图中显示的约束会导致问题,根据下一个截图进行更改

    .

    删除空白的实际限制应根据此(下)屏幕截图。

    【讨论】:

      【解决方案3】:

      我的解决方案:在视图控制器的viewDidLoad() 中设置self.edgesForExtendedLayout = .None

      【讨论】:

        【解决方案4】:
        - (void)hidesTabBar:(BOOL)hidden {
            [UIView beginAnimations:nil context:NULL];
            [UIView setAnimationDuration:0];
        
            for (UIView *view in self.tabBarController.view.subviews) {
                if ([view isKindOfClass:[UITabBar class]]) {
                    if (hidden) {
                        [view setFrame:CGRectMake(view.frame.origin.x, [UIScreen mainScreen].bounds.size.height, view.frame.size.width , view.frame.size.height)];
                    } else {
                        [view setFrame:CGRectMake(view.frame.origin.x, [UIScreen mainScreen].bounds.size.height - 49, view.frame.size.width, view.frame.size.height)];
                    }
                } else {
                    if([view isKindOfClass:NSClassFromString(@"UITransitionView")]) {
                        if (hidden) {
                            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, [UIScreen mainScreen].bounds.size.height)];
                        } else {
                            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, [UIScreen mainScreen].bounds.size.height - 49 )];
                        }
                    }
                }
            }
        
            [UIView commitAnimations];
        }
        

        【讨论】:

          【解决方案5】:

          在视图中推送

          - (BOOL)hidesBottomBarWhenPushed
          {
              return YES;
          }
          

          【讨论】:

            【解决方案6】:

            在取消隐藏 tababr 并到达特定视图后开启。标签栏在uitababr 上方显示空白。这解决了我的问题

            -(void)viewWillAppear:(BOOL)animated
            { 
                [[self.tabBarController.view.subviews objectAtIndex:0] setFrame:CGRectMake(0, 0, 320, 568)];
            
            }
            

            【讨论】:

              【解决方案7】:

              这个对我有用:

              [[self.tabBarController.view.subviews objectAtIndex:0] setFrame:CGRectMake(0, 0, 320, 480)];
              

              我在标签的 viewControllers 中有这段代码。

              【讨论】:

              • 如果不显示状态栏则设置为 490 而不是 480
              【解决方案8】:

              似乎有将底部栏隐藏为标签栏的问题....我面临并为此搜索了很多。我认为这是这个标签栏的错误。然后也是....我们可以使用一些技巧.....

              您可以尝试这样做,如果您尝试隐藏标签栏并留下空白区域,肯定会有所帮助..

              你只需要编写代码就可以了

              [self setHidesBottomBarWhenPushed:YES];
              

              当你推送到其他视图时,你不需要标签栏就写它

              twitDetObj=[[TwitDetail alloc] initWithNibName:@"TwitDetail" bundle:nil];
              [self.navigationController pushViewController:twitDetObj animated:YES];
              self.hidesBottomBarWhenPushed=YES;
              [twitDetObj release];
              

              希望这对你有用.....

              【讨论】:

              • 谢谢。这是正确的答案。其他都是黑客。
              【解决方案9】:

              我遇到了这个问题,我已经通过为我的内容视图更改标签栏的子视图框架解决了这个问题(标签栏中有 2 个子视图 - 内容视图 (#0) 和栏视图 (#1)):

              [[self.tabBarController.view.subviews objectAtIndex:0] setFrame:FULLSCREEN_FRAME];
              

              【讨论】:

              • 谢谢...自从过去 2 小时以来我一直在苦苦挣扎
              • 什么是 FULL_SCREEN_FRAME?
              • @Odelya FULL_SCREEN_FRAME 是您想要的框架/矩形。
              【解决方案10】:

              我遇到了同样的问题,在这里找到了答案:UIView doesn't resize to full screen when hiding the nav bar & tab bar

              当你隐藏标签栏时,只需调整标签栏控制器的大小即可:

              tabBarController.view.frame = CGRectMake(0, 0, 320, 480);
              

              【讨论】:

                【解决方案11】:

                我认为你需要将 self.navigationController.view.frame 设置为全尺寸,即 UIApplication 屏幕框架,然后再设置标签栏隐藏

                【讨论】:

                  【解决方案12】:

                  检查下面的 UIView。它可能设置为白色,因此当您隐藏选项卡时,您会显示白色 UIView。尝试将 UIView 设置为透明。

                  【讨论】:

                    【解决方案13】:

                    它是因为标签栏所在的空间,当你设置标签栏隐藏时没有分配给其他视图你可以设置相应的视图来拉伸或填充整个屏幕,如比例填充或方面填充类似的东西或放大视图比 iphine 屏幕,这样当您将手机更改为横向时,它可以完全填满屏幕

                    【讨论】:

                      【解决方案14】:

                      我假设您已经检查了视图上的自动调整大小箭头?

                      【讨论】:

                      • 应该是评论。它没有回答问题。
                      【解决方案15】:

                      这只是一种解决方法,但是您是否尝试过在用户旋转到横向时以模态方式呈现图形?这应该会遮挡标签栏。

                      你可以避免过渡

                      [viewController presentModalViewController:graph animated:NO]

                      【讨论】:

                        【解决方案16】:

                        标签栏视图控制器的currentViewController.view的一些superviews的clipToBounds设置为YES(它的类名是UITransitionView,如果没有记错的话)。要访问它,请使用

                        tabBarController.currentViewController.view.superview.superview.clipToBounds = NO;
                        

                        这样做之后,您调整视图大小的尝试将不受任何限制并且会成功。祝你好运!

                        【讨论】:

                          【解决方案17】:

                          您确定它被遮挡了,而不仅仅是 A) 没有重绘或 B) GLView 的框架没有占用那个空间?

                          【讨论】:

                          • 我会说它或多或少似乎不占用空间而不是被它遮盖,但是 graph.superview.frame = CGRect(0,0,480,320) 不起作用,也不一样self.view、self.superview,以及任何其他组合。
                          【解决方案18】:

                          您是否尝试过用

                          隐藏 UITabBar
                          tab_bar.hidden = YES
                          

                          【讨论】:

                          • 这就是我正在做的隐藏标签栏,它成功消失了;但在原处留下一个白色矩形。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-05-08
                          • 1970-01-01
                          • 1970-01-01
                          • 2022-06-17
                          • 2021-10-02
                          • 1970-01-01
                          • 2019-04-01
                          相关资源
                          最近更新 更多