如何找到安全区域的高度和宽度?

cod*_*key 4 ios swift

我正在尝试以编程方式为一些标签,按钮和文本字段设置与安全区域的高度和宽度有关的约束。例如,我希望将从标签到安全区域顶部的距离设置为安全区域高度的10%。

如何获取安全区域的高度和宽度?

这是一个合理的方法吗?我的想法是,无论iOS设备如何,屏幕都会自动调整。

谢谢您的帮助!

cod*_*erk 15

您可以通过存储安全区域的框架来获取高度。safeAreaLayoutGuide有一个名为 的属性layoutFrame

let frame = self.view.safeAreaLayoutGuide.layoutFrame
print(frame.height)
print(frame.width)
Run Code Online (Sandbox Code Playgroud)

我做了一个UIView,创建一个扩展只读属性safeAreaFrame

safeAreaFrame如果 iOS 版本是 11 或更高版本,则将是安全区域的框架。

否则,它将是bounds(只是视图的框架)。

extension UIView {
    public var safeAreaFrame: CGRect {
        if #available(iOS 11, *) {
            return safeAreaLayoutGuide.layoutFrame
        }
        return bounds
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

let frame = self.view.safeAreaFrame 
print(frame.height)
print(frame.width)
Run Code Online (Sandbox Code Playgroud)

  • 这个仅适用于 viewDidLayoutSubview,我想将高度存储在变量中。在 viewDidLayouSubviews 中的变量中存储值是否安全 (2认同)

小智 9

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let safeAreaHeight = view.safeAreaLayoutGuide.layoutFrame.height
    let safeAraeWidth = view.safeAreaLayoutGuide.layoutFrame.width
}
Run Code Online (Sandbox Code Playgroud)

请记住在函数中执行此viewDidLayoutSubviews操作或在任何函数中设置约束,然后在内部调用该函数viewDidLayoutSubviews

viewDidLoad不会为您提供安全区域框架,因为它在加载视图之前运行。


max*_*ell 5

if #available(iOS 11.0, *) {
        if let window = UIApplication.shared.keyWindow {
            let safeAreaBottom = window.safeAreaInsets.bottom
            let safeAreaLeft = window.safeAreaInsets.left
            let safeAreaRight = window.safeAreaInsets.right
            let safeAreaTop = window.safeAreaInsets.top
        }
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*aha 0

假设您有一个标签,其高度是根据其超级视图高度尺寸计算的。

var label: UILabel!
Run Code Online (Sandbox Code Playgroud)

您可以锚定标签的高度,例如

  // enable auto-layout
  label.translatesAutoresizingMaskIntoConstraints = false 
  // add label into super view
  view.addSubview(label) 
  // calculate height and activate constraint
  label.heightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.heightAnchor, constant: 0.1).isActive = true // calculate height based on super view safe area layout guide
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下方法激活约束(而不是 .isActive = true):

  let superHeight = view.frame.height
  NSLayoutConstraint.activate([
        label.heightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.heightAnchor, constant: 0.1), // 10% of super view height
        label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: superHeight * 0.1) 
  ])
Run Code Online (Sandbox Code Playgroud)

根据您的要求设置其他约束。

让我们举个例子:

private let testLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = "Test"
    label.numberOfLines = 0 // can be multiple line based on content
    label.textAlignment = .center
    label.textColor = .gray
    return label
}()

private func labelSetup() {
    view.addSubview(testLabel)
    let heightSuperView = view.frame.height
    NSLayoutConstraint.activate([
        testLabel.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 8),
        testLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: heightSuperView*0.1),
        testLabel.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -8)
    ])
}
Run Code Online (Sandbox Code Playgroud)

在 viewDidLoad() 中调用 labelSetup() 方法,您将得到预期的输出。