【发布时间】:2014-08-15 08:07:52
【问题描述】:
我正在尝试将库存 UITabBar 的高度更改为 44px,类似于 Tweetbot 的标签栏高度。我还看到其他一些应用程序也这样做。
但是,当我尝试设置高度时,它仍然保持不变
self.tabBar.frame.height = 40
我们不能改变标签栏的高度吗?如果是这样,什么是好的选择?使用工具栏?
【问题讨论】:
标签: uitabbarcontroller uitabbar
我正在尝试将库存 UITabBar 的高度更改为 44px,类似于 Tweetbot 的标签栏高度。我还看到其他一些应用程序也这样做。
但是,当我尝试设置高度时,它仍然保持不变
self.tabBar.frame.height = 40
我们不能改变标签栏的高度吗?如果是这样,什么是好的选择?使用工具栏?
【问题讨论】:
标签: uitabbarcontroller uitabbar
看来大家都说这不容易
在你的故事板中给你的 UITabBar 一个自定义的子类名称,然后使用以下实现子类
这告诉所有使用标签栏的视图它应该是一个特定的高度。
@implementation MyTabBar
-(CGSize)sizeThatFits:(CGSize)size
{
CGSize sizeThatFits = [super sizeThatFits:size];
sizeThatFits.height = 100;
return sizeThatFits;
}
@end
【讨论】:
SomeGuy 的上述回答对我有用。这是任何可能需要的人的 Swift 翻译。我使高度接近最流行的应用程序使用的高度。
class TabBar: UITabBar {
override func sizeThatFits(size: CGSize) -> CGSize {
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 38
return sizeThatFits
}
}
【讨论】:
适用于 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
}
}
【讨论】:
在你的 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;
}
【讨论】:
通过使用 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
}
}
【讨论】:
如果您启用了自动布局,则需要改写 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
}
}
【讨论】:
开发人员不拥有 tabBar,框架拥有。它会与您对抗以确保 tabBar 保持相同的高度。如果你想解决这个问题,你可以制作自己的工具栏,并在它的高度上添加 autlayout 约束,以强制它保持你想要的任何高度。
【讨论】:
如果您使用的是 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 上的标签栏高度似乎很低。
【讨论】:
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;
}
【讨论】: