如何获得直到标签栏底部的屏幕尺寸

how to get the screen size until the bottom of the tabbar

我正在处理自定义标签栏按钮的东西,想知道如何使用视图的高度或以编程方式向上移动按钮。

我有这个加号按钮,我想从底部向上移动 10pt。

let newButton = UIButton(frame: CGRect(x: 0, y: 0, width: 65, height: 65))
newButton.imageView?.contentMode = .scaleAspectFit
newButton.contentHorizontalAlignment = .fill
newButton.contentVerticalAlignment = .fill
      
var newButtonFrame = newEventButton.frame
newButtonFrame.origin.y = view.bounds.height - 65 - 10

所以上面的代码在 iPhone 没有主页按钮槽口时有效。比如获取视图的高度并减去按钮高度和 10。

但是,很明显,当有一个缺口时,它就会变成下图这样的东西。

我想将按钮从标签栏的底部向上移动,那么我怎样才能获得屏幕的高度直到标签栏的底部,这在两个 with/without 主屏幕上都有效?

对于按钮原点,使用 safe 是 insets,如果设备有凹口,safeAreaBottom 将像 44,如果没有,它将是 0:

let safeAreaBottom = UIApplication.shared.windows.first?.safeAreaInsets.bottom

那就用吧:

newButtonFrame.origin.y = view.bounds.height - safeAreaBottom - 65 - 10

虽然@wonder 的回答完全正确,但仍有一些缺陷。

首先,您不应该像这样使用框架来确定视图布局。

其次,无需为此访问 windows 的 UIApplication 单例。因为它位于 parents 视图中。在 safeAreaInsetssafeAreaLayoutGuide.

布局指南针对锚点,比框架更可持续。

这里有示例代码:

let newButton = UIButton()
newButton.imageView?.contentMode = .scaleAspectFit
newButton.contentHorizontalAlignment = .fill
newButton.contentVerticalAlignment = .fill
NSLayoutConstraint.activate([
    newButton.heightAnchor.constraint(equalTo: 65),
    newButton.widthAnchor.constraint(equalTo: 65),
    newButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    newButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10)
])