如何纠正iPhone X上的标签栏高度问题

时间:2017-11-01 12:20:02

标签: ios swift xcode uistoryboard iphone-x

在测试iPhone X时,我的应用程序出现问题。我不确定如何调整此问题,并且不会将其作为非iPhone X尺寸的问题。这似乎只是iPhone X模拟器上的一个问题。

enter image description here

enter image description here

21 个答案:

答案 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)

"File inspector"

&#34;文件检查员&#34;从XCode故事板右侧,启用安全区域指南布局以支持iPhone中的应用程序

This post描述的非常好。

答案 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的底部与超级视图对齐,而不是与安全区域对齐。如果将其对准安全区域,它将像这样:

Align to safe area

当与超级视图对齐时,它将正确显示:

Align to Superview

我认为这是因为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之下面临这个外观问题。

enter image description here

我有一个从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的准则。

  1. UITabBar.appearance()。selectionIndicatorImage = #YOUR_IMAGE
  2. 确保您的图像高度为48。

标签栏selectionIndicatorImage的默认高度为49,但在iPhone X中,将图片高度设置为48。

答案 19 :(得分:0)

我遇到了类似的问题。我在viewDidLoad()中设置了selectionIndicatorImage。将代码移动到viewDidLayoutSubviews()修复了我的问题。

答案 20 :(得分:0)

在约束中 -

如果您使用“底部布局指南”给出底部空间,则会出现此问题。

<强>解决方案:

为superview提供底层空间。这将100%完美。