在iOS7/8中如何改变UITabBar的高度?

19

我试图将标准的UITabBar高度更改为44px,类似于Tweetbot的选项卡栏高度。我还看到其他一些应用程序也这样做。

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

self.tabBar.frame.height = 40

我们不能改变选项卡栏的高度吗?如果不行,有没有好的替代方案?可以使用工具栏吗?

9个回答

39

看起来每个人都说这不容易做到

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

这告诉所有使用选项卡栏的视图它应该有固定的高度。

@implementation MyTabBar

-(CGSize)sizeThatFits:(CGSize)size
{
    CGSize sizeThatFits = [super sizeThatFits:size];
    sizeThatFits.height = 100;

    return sizeThatFits;
}

@end

输入图像描述


非常感谢您!我在下面添加了Swift的翻译。 - Melly
这真是太棒了。如此简单而又如此有效!:D - napolux
@Lev,它仍然有效,请确保您在Interface Builder中设置了自定义UITabBar类。 - SomeGuy
@SomeGuy 我已经尝试过了...我确定。我在方法内设置了日志记录以查看它是否被调用。它确实被调用了,但是没有任何效果。我尝试了从1到100的各种数字,但都没有任何效果,但该方法仍然被调用。我在模拟器和手机(8.3)上都尝试过了。 - SikoSoft
@SomeGuy,还有其他需要完成的事情吗?或者有什么不需要做的事情吗?与故事板中的限制有关的任何事情? - SikoSoft
1
@Lev 我相信你已经启用了自动布局。这将要求你重写以下方法:override func intrinsicContentSize() -> CGSize { var sizeThatFits = super.frame.size sizeThatFits.height = 120 return sizeThatFits } - jernkuan

33

SomeGuy的答案对我有用。这里是Swift的翻译,供需要的人使用。我将高度设置为接近大多数流行应用程序使用的值。

class TabBar: UITabBar {

     override func sizeThatFits(size: CGSize) -> CGSize {
         var sizeThatFits = super.sizeThatFits(size)
         sizeThatFits.height = 38

         return sizeThatFits
     }
}

你调用了两次super的实现,第一个是不必要的。 - Dave Batton
3
通过创建一个简单的扩展,无需创建子类。 - der_michael

11

适用于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
    }
 }

6

在Swift中,使用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
    }
}

3
这确实很有效,但是UITabBar项的大小没有相应地调整。如何解决这个问题? - damianesteban
3
扩展不应用于覆盖功能。这是未定义的行为。 - rmaddy

6
在您的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

1
请注意,在较新版本的Swift中,intrinsicContentSize现在是一个计算属性。请参阅:https://dev59.com/RFkT5IYBdhLWcg3wPdKU - Jason Machacek

2

如果你使用的是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上,标签栏的高度会显得较低。

2

开发者并不拥有 tabBar,框架拥有。它会与你作斗争,以确保 tabBar 保持相同的高度。如果你想解决这个问题,你可以制作自己的工具栏,并添加自动布局约束来强制其保持任何你想要的高度。


0

对于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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接