【问题标题】:How can I find the height and width of the safe area?如何找到安全区域的高度和宽度?
【发布时间】:2018-02-25 08:15:14
【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

标签: ios swift


【解决方案1】:

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

let frame = self.view.safeAreaLayoutGuide.layoutFrame
print(frame.height)
print(frame.width)

我创建了一个 UIView 扩展,创建了一个名为 safeAreaFrameread-only property

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

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

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

示例:

let frame = self.view.safeAreaFrame 
print(frame.height)
print(frame.width)

【讨论】:

  • 这个只适用于viewDidLayoutSubview,我想将高度存储在一个变量中。在 viewDidLayouSubviews 中的变量中存储值是否安全
【解决方案2】:
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
        }
}

【讨论】:

  • 谢谢。这正是我想要的。
【解决方案3】:
override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    let safeAreaHeight = view.safeAreaLayoutGuide.layoutFrame.height
    let safeAraeWidth = view.safeAreaLayoutGuide.layoutFrame.width
}

记得在 viewDidLayoutSubviews 函数中执行此操作,或者在任何函数中设置约束,然后在 viewDidLayoutSubviews 中调用该函数。

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

【讨论】:

    【解决方案4】:

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

    var label: UILabel!
    

    你可以像这样锚定标签的高度

      // 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
    

    您也可以使用以下方法激活约束(而不是 .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) 
      ])
    

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

    举个例子:

    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)
        ])
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多