如何解决问题
重写 traitCollection,就能创建超过5个 tab,并且不出现More tab。这种方式没有改变UITabBarController的使用方式,入侵性最小,不需要使用第三方库。
override var traitCollection: UITraitCollection {
let realTraits = super.traitCollection
let lieTrait = UITraitCollection.init(horizontalSizeClass: .regular)
return UITraitCollection(traitsFrom: [realTraits, lieTrait])
}
当你重写 traitCollection 并返回一个包含 .regular 水平尺寸类别的 UITraitCollection,系统将会认为当前设备的宽度足够大,可以显示更多的标签。这样即使在宽度有限的设备(如 iPhone)上,你也能显示超过五个标签。
问答
https://stackoverflow.com/questions/10313845/can-we-add-more-than-five-tab-bar-in-ios-sdk
解释
在iOS应用中,默认情况下,当设备的尺寸类别(Size Class)为紧凑(Compact)时,UITabBarController 只允许显示最多五个标签(Tab)。这是因为紧凑的尺寸类别意味着屏幕宽度有限,无法容纳更多的标签。
通过重写 traitCollection 属性并将水平尺寸类别(horizontalSizeClass)强制设为常规(Regular),你可以让系统认为设备有足够的宽度来显示更多的标签。这会导致 UITabBarController 在显示标签时使用适合常规尺寸类别的布局,从而允许显示超过五个标签。
以下是具体解释:
代码详解
override var traitCollection: UITraitCollection {
let realTraits = super.traitCollection
let lieTrait = UITraitCollection(horizontalSizeClass: .regular)
return UITraitCollection(traitsFrom: [realTraits, lieTrait])
}
1、let realTraits = super.traitCollection:获取当前视图控制器的实际特性集合。
2、let lieTrait = UITraitCollection(horizontalSizeClass: .regular):创建一个新的特性集合,水平尺寸类别设为 .regular。
3、return UITraitCollection(traitsFrom: [realTraits, lieTrait]):合成实际特性和伪特性,返回一个包含两者的新特性集合。
结果
通过这种方式,UITabBarController 会认为它有足够的空间来显示更多的标签,进而允许超过五个标签的显示。
使用场景和注意事项
1、使用场景:这种方法适用于你需要在标签栏中显示超过五个标签,并且不希望使用更多复杂的解决方案(如自定义标签栏)。
2、注意事项:强制修改特性集合可能会影响其他布局行为,导致意外的问题。例如,其他依赖于尺寸类别的视图和控件可能会认为它们有更多的空间,从而影响其布局和显示。因此,使用此方法时需要进行充分测试,确保应用在不同设备和方向上都能正常工作。
总结来说,通过重写 traitCollection,可以让系统认为设备具有更宽的尺寸,从而允许在 UITabBarController 中显示超过五个标签。然而,这种方法应谨慎使用,以避免其他布局问题。