我正在尝试对某些标签,按钮和文本字段进行编程设置的约束,相对于安全区域的高度和宽度。例如,我希望将标签从安全区域的顶部设置为安全区域高度的10%。
如何检索安全区域的高度和宽度?
这是一种合理的方法吗?我的思考过程是我的屏幕将自动调整,无论iOS设备如何。
感谢您的帮助!
您可以通过存储安全区域的框架来获得高度。safeAreaLayoutGuide
具有名为layoutFrame
的属性。
let frame = self.view.safeAreaLayoutGuide.layoutFrame
print(frame.height)
print(frame.width)
我制作了一个UIView
扩展程序,该扩展名创建了一个只读的属性,称为safeAreaFrame
。
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)
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
}
}
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
let safeAreaHeight = view.safeAreaLayoutGuide.layoutFrame.height
let safeAraeWidth = view.safeAreaLayoutGuide.layoutFrame.width
}
记住在viewDidLayoutSubviews
函数中执行此操作或在任何功能中设置约束,然后在viewDidLayoutSubviews
中调用该功能。
viewDidLoad
不会在加载视图之前运行安全区域框架。
假设您有一个标签,哪个高度是根据其超级图高度尺寸计算的。
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)
])
}
call labelsetup((方法在viewdidload((中,您将获得预期的输出。