【问题标题】:calculating height of UITabBar计算 UITabBar 的高度
【发布时间】:2011-03-07 14:58:29
【问题描述】:

我正在编写一个使用UITabBar 进行部分导航的应用程序。我还使用UIScrollView 来提供比屏幕通常可以处理的信息更多的信息。因此,我需要设置滚动视图以考虑UITabBar 的高度,以便显示所有信息。

有没有办法计算UITabBarheight

【问题讨论】:

    标签: iphone cocoa-touch uikit uiscrollview uitabbar


    【解决方案1】:

    如果视图控制器的祖先是标签栏控制器,您可以从该标签栏检索高度。

    CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
    

    【讨论】:

      【解决方案2】:

      它是 320 x 49。

      如果你想测试,打开Interface Builder,添加一个UITabBar,进入标尺,你会看到它

      UITabBar is inherited from UIVIew 所以你可以使用frame.size.height 来获取高度

      【讨论】:

      • 能保证一直保持这种状态吗?我宁愿使用 API 来获取价值,也不愿依赖使用 IB 并将幻数插入应用程序。
      • UITabBar 继承自 UIView,所以你可以试试 UIView 的 frame.size.height
      • 我下班回来会试一试。你知道我是否可以在不创建对象实例的情况下得到它吗?此外,创建一个虚拟实例还是将正在使用的 UITabBar 从应用程序委托传递给我正在使用的视图以便它具有更准确的值会更好吗?
      • 当我使用IB时,我无法改变UITabBar的高度,所以我认为它会被修复。如果你想使用 API,没有类方法:(
      • 假设您的应用程序委托有一个标签栏控制器变量 tabBarController 可以通过 ((YouAppDelegate *)UIApplication.sharedApplication.delegate).tabBarController.tabBar.frame.size.height 访问高度
      【解决方案3】:

      在斯威夫特中:

      let height = self.tabBarController?.tabBar.frame.height ?? 49.0
      

      依赖标签栏的实际高度,并使用幻数作为后备。

      【讨论】:

      • 这是错误的,因为如果 iPhone 有一个缺口,魔术后备数字不是 49,而是 83
      【解决方案4】:

      斯威夫特 3+

      let tabBarHeight = tabBarController?.tabBar.frame.size.height
      print(tabBarHeight ?? "not defined")
      

      它应该打印 49.0 (Type CGFloat)

      【讨论】:

        【解决方案5】:

        我希望通过在 ViewController 视图的 VISIBLE 部分中将标签居中来做类似的事情。这个 ViewController 属于一个 UITabBarController。

        这是我用来使标签居中的代码:

        UILabel *roomLabel = [[UILabel alloc] init];
        CGRect frame = [[self view] bounds];
        float tabBarHeight = [[[super tabBarController] tabBar] frame].size.height;
        frame.size.height -= tabBarHeight;
        [roomLabel setFrame:frame];
        [[self view] addSubview:roomLabel];
        [roomLabel release];
        

        请注意,我使用的是 [[self view] bounds] 而不是 [[self view] frame],因为后者包含 20 像素的顶栏作为 Y 偏移量(它会影响垂直居中)。

        希望这对某人有所帮助!

        顺便说一句:我使用的是 iOS 4.3 和 XCode 4,TabBar 高度的“硬编码”值对我来说仍然是 49!

        【讨论】:

          【解决方案6】:

          我知道这并不理想,但我真的不想在任何地方都有一个幻数常量。我所做的是创建一个一次性的 UITabBarController,并从那里获取高度。

          我这样做也是因为 [UITabBar initWithFrame:] 可以按需要工作,但执行 [bar setFrame:] 不能。我需要框架在创建时是正确的。

          UITabBarController *dtbc = [[[UITabBarController alloc] init] autorelease];
          
          CGRect tabRect = [[[self navigationController] view] frame];
          tabRect.origin.y = tabRect.size.height - [[dtbc tabBar] frame].size.height;
          tabRect.size.height = [[dtbc tabBar] frame].size.height;
          
          tabBar_ = [[UITabBar alloc] initWithFrame:tabRect];
          

          我喜欢这个的地方在于它会正确地将标签栏放置在父级的底部,而不管父级的大小。

          【讨论】:

            【解决方案7】:

            这在大多数情况下应该适用于 UIViewController 的任何实例:

            bottomLayoutGuide.length
            

            【讨论】:

              【解决方案8】:

              在swift 4和5中。self.tabBarController?.getHeight()

              extension UITabBarController{
              
                  func getHeight()->CGFloat{
                      return self.tabBar.frame.size.height
                  }
              
                  func getWidth()->CGFloat{
                       return self.tabBar.frame.size.width
                  }
              }
              

              【讨论】:

                【解决方案9】:

                这就是我让它在 swift 4.1 中工作的方式

                let tabBarHeight = CGFloat((self.tabBarController?.tabBar.frame.size.height)!)
                

                【讨论】:

                  【解决方案10】:
                  let screenHeight = UIApplication.shared.statusBarFrame.height +
                              self.navigationController!.navigationBar.frame.height + (tabBarController?.tabBar.frame.size.height)!
                  

                  这很好用,基于这里的几个 ppls 回答

                  【讨论】:

                    【解决方案11】:

                    SWIFT 5 更新:

                    由于这个帖子很旧,我在这里发布另一个帖子的更新:https://stackoverflow.com/a/25550871/14559220。总结一下,

                    在纵向和常规横向中,高度仍然是 49 点。在 紧凑的景观,高度现在是 32 点。

                    在 iPhone X 上,纵向高度为 83 点,纵向高度为 53 点 风景。

                    【讨论】:

                      【解决方案12】:

                      斯威夫特 5

                          if let tabBarController = tabBarController {
                              let tabBarSafeAreaHeight = tabBarController.tabBar.frame.size.height - 
                                  tabBarController.tabBar.safeAreaInsets.bottom
                          }
                      

                      这会考虑到 safeAreaInsets (UIEdgeInsets) 来计算 UITabBar 的高度

                      在撰写本文时,这等于 iPhone 纵向上的 49

                      【讨论】:

                        猜你喜欢
                        • 2014-05-27
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-05-15
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-09-24
                        • 1970-01-01
                        相关资源
                        最近更新 更多