如何找到安全区域的高度和宽度?
Posted
技术标签:
【中文标题】如何找到安全区域的高度和宽度?【英文标题】:How can I find the height and width of the safe area? 【发布时间】:2018-02-25 08:15:14 【问题描述】:我正在尝试以编程方式为某些标签、按钮和文本字段设置相对于安全区域的高度和宽度的约束。例如,我希望将标签到安全区域顶部的距离设置为安全区域高度的 10%。
如何获取安全区域的高度和宽度?
这是一种合理的方法吗?我的想法是,无论 ios 设备如何,我的屏幕都会自动调整。
感谢您的帮助!
【问题讨论】:
Get safe area inset top and bottom heights的可能重复 【参考方案1】:您可以通过存储安全区域的框架来获取高度。 safeAreaLayoutGuide
有一个名为 layoutFrame
的属性。
let frame = self.view.safeAreaLayoutGuide.layoutFrame
print(frame.height)
print(frame.width)
我创建了一个 UIView
扩展,创建了一个名为 safeAreaFrame
的 read-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()方法,你会得到预期的输出。
【讨论】:
以上是关于如何找到安全区域的高度和宽度?的主要内容,如果未能解决你的问题,请参考以下文章