【问题标题】:changing the height of UITabBar in iOS7/8?在iOS7/8中改变UITabBar的高度?
【发布时间】:2014-08-15 08:07:52
【问题描述】:

我正在尝试将库存 UITabBar 的高度更改为 44px,类似于 Tweetbot 的标签栏高度。我还看到其他一些应用程序也这样做。

但是,当我尝试设置高度时,它仍然保持不变

self.tabBar.frame.height = 40

我们不能改变标签栏的高度吗?如果是这样,什么是好的选择?使用工具栏?

【问题讨论】:

    标签: uitabbarcontroller uitabbar


    【解决方案1】:

    看来大家都说这不容易

    在你的故事板中给你的 UITabBar 一个自定义的子类名称,然后使用以下实现子类

    这告诉所有使用标签栏的视图它应该是一个特定的高度。

    @implementation MyTabBar
    
    -(CGSize)sizeThatFits:(CGSize)size
    {
        CGSize sizeThatFits = [super sizeThatFits:size];
        sizeThatFits.height = 100;
    
        return sizeThatFits;
    }
    
    @end
    

    【讨论】:

    • 非常感谢!我在下面添加了 Swift 翻译。
    • 这是黄金。如此简单,如此有效! :D
    • @Lev 它仍然有效,请确保您已在 Interface Builder 中设置自定义 UITabBar 类
    • @SomeGuy 我做到了...我确定。我在该方法中设置了日志记录以查看它是否被调用。是的,但它没有任何效果。我尝试了从 1 到 100 的各种数字,但没有任何效果,但该方法继续被调用。我在模拟器和手机(8.3)上都试过了。
    • @Lev 我相信您启用了自动布局。这将需要您覆盖 override func intrinsicContentSize() -> CGSize { var sizeThatFits = super.frame.size sizeThatFits.height = 120 return sizeThatFits }
    【解决方案2】:

    SomeGuy 的上述回答对我有用。这是任何可能需要的人的 Swift 翻译。我使高度接近最流行的应用程序使用的高度。

    class TabBar: UITabBar {
    
         override func sizeThatFits(size: CGSize) -> CGSize {
             var sizeThatFits = super.sizeThatFits(size)
             sizeThatFits.height = 38
    
             return sizeThatFits
         }
    }
    

    【讨论】:

    • 你调用了 super 的实现两次。第一个不需要。
    • 创建一个简单的扩展不需要子类化
    【解决方案3】:

    适用于 Swift 3 和 xcode 8

    extension UITabBar {
         override open func sizeThatFits(_ size: CGSize) -> CGSize {
         var sizeThatFits = super.sizeThatFits(size)
         sizeThatFits.height = 80 // adjust your size here
         return sizeThatFits
        }
     }
    

    【讨论】:

      【解决方案4】:

      在你的 UITabBarController 中

      - (void)viewWillLayoutSubviews {
          CGRect tabFrame = self.tabBar.frame;
          tabFrame.size.height = 80;
          tabFrame.origin.y = self.view.frame.size.height - 80;
          self.tabBar.frame = tabFrame; 
      }
      

      【讨论】:

        【解决方案5】:

        通过使用 UITabBar 的扩展,它甚至比上面建议的所有解决方案都更简单,不需要子类化:

        extension UITabBar {
        
            override public func sizeThatFits(size: CGSize) -> CGSize {
                super.sizeThatFits(size)
                var sizeThatFits = super.sizeThatFits(size)
                sizeThatFits.height = <Insert your height here>
                return sizeThatFits
            }
        }
        

        【讨论】:

        • 这确实很好用,但是 UITabBar 项目没有相应地调整大小。如何做到这一点?
        • 不应使用扩展来覆盖功能。这是未定义的行为。
        【解决方案6】:

        如果您启用了自动布局,则需要改写 instrinsicContentSize

        Proper usage of intrinsicContentSize and sizeThatFits: on UIView Subclass with autolayout

        class TabBar: UITabBar {
            override func intrinsicContentSize() -> CGSize {
                var intrinsicSize = super.frame.size
        
                intrinsicSize.height = 120
                return intrinsicSize
             }
        }
        

        【讨论】:

        【解决方案7】:

        开发人员不拥有 tabBar,框架拥有。它会与您对抗以确保 tabBar 保持相同的高度。如果你想解决这个问题,你可以制作自己的工具栏,并在它的高度上添加 autlayout 约束,以强制它保持你想要的任何高度。

        【讨论】:

          【解决方案8】:

          如果您使用的是 iOS 11,那么以下操作会有所帮助

          -(CGSize)sizeThatFits:(CGSize)size
          {
              CGSize sizeThatFits = [super sizeThatFits:size];
              sizeThatFits.height = 60;
          
              if (@available(iOS 11.0, *)) {
                  UIWindow *window = UIApplication.sharedApplication.keyWindow;
                  CGFloat bottomPadding = window.safeAreaInsets.bottom;
                  sizeThatFits.height += bottomPadding;
              }
          
              return sizeThatFits;
          }
          

          基本上需要覆盖安全区域,否则 iPhone X 上的标签栏高度似乎很低。

          【讨论】:

            【解决方案9】:

            iOS11及以上可以使用如下:

            - (void)viewDidLayoutSubviews {
                [super viewDidLayoutSubviews];
                if (@available(iOS 11.0, *)) {
                    self.additionalSafeAreaInsets = UIEdgeInsetsMake(0, 0, 20, 0);
                } 
            }
            

            对于所有操作系统,创建 UITabBar 子类,在 UITabBarController 中使用它并在自定义标签栏类的实现中实现以下方法:

            -(CGSize)sizeThatFits:(CGSize)size {
                CGSize sizeThatFits = [super sizeThatFits:size];
                sizeThatFits.height = kBarHeight;
                return sizeThatFits;
            }
            

            【讨论】:

              猜你喜欢
              • 2014-05-27
              • 1970-01-01
              • 2012-09-19
              • 1970-01-01
              • 2011-03-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多