计算UITabBar的高度

63

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

有没有一种方法来计算 UITabBar高度

13个回答

76

如果视图控制器有一个作为选项卡栏控制器的祖先,你可以从那个选项卡栏获取高度。

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

69

它的尺寸为320 x 49。

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

UITabBar继承自UIView因此您可以使用frame.size.height来获取高度。


13
保证一直保持这种状态吗?我宁愿使用API获取值,而不是依赖使用IB并将神奇数字插入到应用程序中。 - Matt Delves
8
假设您的应用程序委托(App Delegate)拥有一个标签栏控制器变量tabBarController,可以通过以下方式访问其高度: ((YouAppDelegate *)UIApplication.sharedApplication.delegate).tabBarController.tabBar.frame.size.height - Matt Delves
只是对Matt Delves解决方案的更新,您不需要在应用程序委托中公开tabBarController成员。您始终可以从UIViewController对象访问tabBarController,该对象是您的tabBarController的子代(或其祖先之一是子代),如下所示:self.tabBarController.tabBar.frame.size.height - CodeBrew
320和49都是“魔法数字”,容易混淆和出错(例如:在iOS7和iPad上错误)。这也没有回答问题,即如何计算这些值(暗示:以编程方式)。当我输入这个时,Vladamir的回答似乎是最好的。 - Olie
在iOS 9上,它的高度仍然保持不变。 - ABCD
显示剩余5条评论

23

在 Swift 中:

let height = self.tabBarController?.tabBar.frame.height ?? 49.0
依赖于实际的选项卡栏高度,并使用魔数作为备用方案。

2
这是错误的,因为如果iPhone有刘海屏,魔术回退数字不是49,而是83。 - Lance Samaria
应该是 frame.size.height - ABCD

10

Swift 3+

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

它应该打印出49.0(CGFloat类型)


9
我想要在一个UITabBarController的ViewController中,将label居中显示在可见部分。以下是我使用的代码:
```swift label.center = CGPoint(x: view.bounds.midX, y: view.bounds.midY) view.addSubview(label) ```
请注意,此代码假定您已经创建了一个名为“label”的UILabel,并且它已经被正确地配置和初始化。
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,并且选项卡栏高度的“硬编码”值仍然为49!

4

这个方法在大多数情况下都适用于任何UIViewController的实例:

bottomLayoutGuide.length

在iOS 11.0中已被弃用,我不确定应该使用什么来替代。 - neoneye

4
我知道这不是理想的情况,但是我真的不想在任何地方使用魔法数字常量。我的做法是创建一个临时的UITabBarController,并从中获取高度。
我这样做也是因为[UITabBar initWithFrame:]的效果与预期相同,但执行[bar setFrame:]并不起作用。我需要在创建时设置正确的frame。
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];

我喜欢的是,它能正确地将选项卡栏放置在父元素的底部,而不管父元素的大小如何。

4
在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
    }
}

2

其他人也可以尝试使用选项卡栏的intrinsicContentSize属性来获取高度。

let tabBarHeight = self.tabBarController.tabBar.intrinsicContentSize.height

1

这是我在Swift 4.1中让它正常工作的方法。

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

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