答案 0 :(得分:12)
在 iOS 12.1 上,我通过覆盖UITabBar子类中的safeAreaInsets解决了此问题:
class TabBar: UITabBar {
private var cachedSafeAreaInsets = UIEdgeInsets.zero
override var safeAreaInsets: UIEdgeInsets {
let insets = super.safeAreaInsets
if insets.bottom < bounds.height {
cachedSafeAreaInsets = insets
}
return cachedSafeAreaInsets
}
}
答案 1 :(得分:10)
答案 2 :(得分:9)
使用以下代码创建一个单独的文件:
extension UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
super.sizeThatFits(size)
guard let window = UIApplication.shared.keyWindow else {
return super.sizeThatFits(size)
}
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = window.safeAreaInsets.bottom + 40
return sizeThatFits
}
}
答案 3 :(得分:4)
对于iOS 11.3,这对我有用:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tabBar.invalidateIntrinsicContentSize()
}
答案 4 :(得分:3)
我遇到了同样的问题。幸运的是,以下帖子救了我。我相信你可以解决它的问题。
https://novemberfive.co/blog/apple-september-event-iphonex-apps/
使用UITabBar的基本视图填充底部区域的技术可以解决您遇到的问题。
答案 5 :(得分:2)
我的解决方案是我有一个自定义的UITabBar高度设置,如下所示:
override func viewWillLayoutSubviews() {
var tabFrame = tabBar.frame
tabFrame.size.height = 60
tabFrame.origin.y = self.view.frame.size.height - 60
tabBar.frame = tabFrame
}
将其删除,标签栏将在iPhone X上正确显示。
答案 6 :(得分:2)
只需将UITabBar的底部与超级视图对齐,而不是与安全区域对齐。如果将其对准安全区域,它将像这样:
当与超级视图对齐时,它将正确显示:
我认为这是因为Apple在iPhone X上为标签栏项目提供了默认的空白边距,因为他们希望将标签栏扩展到屏幕底部以避免浮动栏。
答案 7 :(得分:1)
当我使用选择图像时,这对我有用。
tabBar.selectionIndicatorImage = UIImage.imageWithColor(color: UIColor.NewDesignColor.yellow, size: tabBarItemSize).resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 0, bottom: 20, right: 0))
添加底部插图有助于我的情况。 希望这对你也有用。 感谢。
答案 8 :(得分:1)
Apple现在已在 iOS 12.1.1
中修复了此问题答案 9 :(得分:0)
尝试了几种解决方案后,对我有用的是在viewDidLoad中添加以下行:
[self.tabBar.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor].active = YES;
乔纳(Jonah)和穆罕默(Mehul Thakkar)的回答为我指明了正确的方向。
注意:我在情节提要中只有一个空白的标签栏控制器。标签栏图像和视图控制器是使用tabBarItem
属性(例如,视图控制器上的tabBarItem.title
)设置的。
答案 10 :(得分:0)
viewWillLayoutSubviews中UITabBar的invalidateIntrinsicContentSize可能对您有帮助。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.tabBar.invalidateIntrinsicContentSize()
}
答案 11 :(得分:0)
尽管我的回答来晚了,但是让我向您保证,如果您在iphone x,xs或max屏幕上遇到类似问题,请确保要上传的图像尺寸必须为height = width * 48pxHeight。
答案 12 :(得分:0)
我仅在iOS 11.0或更高版本12.0之下面临这个外观问题。
我有一个从UITabBar继承的CustomTabBar类。 我重写了如下的frame方法:
- (CGRect)frame{
return self.bounds;
}
它在大多数iOS版本11.0中解决了此问题*
答案 13 :(得分:0)
这对我有用。
[self.tabBar.bottomAnchor constraintEqualToAnchor:self.view.layoutMarginsGuide.bottomAnchor].active = YES;
答案 14 :(得分:0)
如果您的UIViewController可旋转,则将其放入UITabBarViewController中以纠正TabBar的高度。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
tabBar.sizeToFit()
}
答案 15 :(得分:0)
将此代码添加到viewDidLoad
DispatchQueue.main.async {
let size = CGSize(width: self.tabBar.frame.width / numberOfTabsFloat,
height: self.tabBar.frame.height)
let image = UIImage.drawTabBarIndicator(color: UIColor.white,
size: size,
onTop: false)
UITabBar.appearance().selectionIndicatorImage = image
self.tabBar.selectionIndicatorImage = image
}
并添加此扩展名
extension UIImage{
//Draws the top indicator by making image with filling color
class func drawTabBarIndicator(color: UIColor, size: CGSize, onTop: Bool) -> UIImage {
let indicatorHeight = size.height
let yPosition = onTop ? 0 : (size.height - indicatorHeight)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(CGRect(x: 0, y: yPosition, width: size.width, height: indicatorHeight))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
答案 16 :(得分:0)
看起来很疯狂,但我只需要在代码中删除这一行
self.view.layoutIfNeeded()
我只是猜测在屏幕上未出现的视图上调用layoutIfNeeded会使此问题发生。 无论如何,@ mohamed-ali的解决方案也可以正常工作。非常感谢你。
答案 17 :(得分:0)
有UITabBar
子类可以解决我所有关于iPhone X的问题iOS 11
/ iOS 12
class TabBar: UITabBar {
private var _safeAreaInsets = UIEdgeInsets.zero
private var _subviewsFrames: [CGRect] = []
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if _safeAreaInsets != safeAreaInsets {
_safeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 12.0, *) {
let bottomInset = safeAreaInsets.bottom
if bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90) {
size.height += bottomInset
}
}
return size
}
override var frame: CGRect {
get {
return super.frame
}
set {
var tmp = newValue
if let superview = superview, tmp.maxY !=
superview.frame.height {
tmp.origin.y = superview.frame.height - tmp.height
}
super.frame = tmp
}
}
override func layoutSubviews() {
super.layoutSubviews()
let state = subviews.map { $0.frame }
if (state.first { $0.width == 0 } == nil) {
_subviewsFrames = state
} else {
zip(subviews, _subviewsFrames).forEach { (view, rect) in
view.frame = rect
}
}
}
}
答案 18 :(得分:0)
遵循以下有关设置UITabbar selectionIndicatorImage的准则。
标签栏selectionIndicatorImage的默认高度为49,但在iPhone X中,将图片高度设置为48。
答案 19 :(得分:0)
我遇到了类似的问题。我在viewDidLoad()中设置了selectionIndicatorImage。将代码移动到viewDidLayoutSubviews()修复了我的问题。
答案 20 :(得分:0)
在约束中 -
如果您使用“底部布局指南”给出底部空间,则会出现此问题。
<强>解决方案:强>
为superview提供底层空间。这将100%完美。