【发布时间】:2011-03-07 14:58:29
【问题描述】:
我正在编写一个使用UITabBar 进行部分导航的应用程序。我还使用UIScrollView 来提供比屏幕通常可以处理的信息更多的信息。因此,我需要设置滚动视图以考虑UITabBar 的高度,以便显示所有信息。
有没有办法计算UITabBar的height?
【问题讨论】:
标签: iphone cocoa-touch uikit uiscrollview uitabbar
我正在编写一个使用UITabBar 进行部分导航的应用程序。我还使用UIScrollView 来提供比屏幕通常可以处理的信息更多的信息。因此,我需要设置滚动视图以考虑UITabBar 的高度,以便显示所有信息。
有没有办法计算UITabBar的height?
【问题讨论】:
标签: iphone cocoa-touch uikit uiscrollview uitabbar
如果视图控制器的祖先是标签栏控制器,您可以从该标签栏检索高度。
CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
【讨论】:
它是 320 x 49。
如果你想测试,打开Interface Builder,添加一个UITabBar,进入标尺,你会看到它
UITabBar is inherited from UIVIew 所以你可以使用frame.size.height 来获取高度
【讨论】:
在斯威夫特中:
let height = self.tabBarController?.tabBar.frame.height ?? 49.0
依赖标签栏的实际高度,并使用幻数作为后备。
【讨论】:
斯威夫特 3+
let tabBarHeight = tabBarController?.tabBar.frame.size.height
print(tabBarHeight ?? "not defined")
它应该打印 49.0 (Type CGFloat)
【讨论】:
我希望通过在 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!
【讨论】:
我知道这并不理想,但我真的不想在任何地方都有一个幻数常量。我所做的是创建一个一次性的 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];
我喜欢这个的地方在于它会正确地将标签栏放置在父级的底部,而不管父级的大小。
【讨论】:
这在大多数情况下应该适用于 UIViewController 的任何实例:
bottomLayoutGuide.length
【讨论】:
在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
}
}
【讨论】:
这就是我让它在 swift 4.1 中工作的方式
let tabBarHeight = CGFloat((self.tabBarController?.tabBar.frame.size.height)!)
【讨论】:
let screenHeight = UIApplication.shared.statusBarFrame.height +
self.navigationController!.navigationBar.frame.height + (tabBarController?.tabBar.frame.size.height)!
这很好用,基于这里的几个 ppls 回答
【讨论】:
SWIFT 5 更新:
由于这个帖子很旧,我在这里发布另一个帖子的更新:https://stackoverflow.com/a/25550871/14559220。总结一下,
在纵向和常规横向中,高度仍然是 49 点。在 紧凑的景观,高度现在是 32 点。
在 iPhone X 上,纵向高度为 83 点,纵向高度为 53 点 风景。
【讨论】:
斯威夫特 5
if let tabBarController = tabBarController {
let tabBarSafeAreaHeight = tabBarController.tabBar.frame.size.height -
tabBarController.tabBar.safeAreaInsets.bottom
}
这会考虑到 safeAreaInsets (UIEdgeInsets) 来计算 UITabBar 的高度
在撰写本文时,这等于 iPhone 纵向上的 49
【讨论】: