Issue #98
The safeAreaLayoutGuide was introduced in iOS 11. And it is advised to stop using topLayoutGuide bottomLayoutGuide as these are deprecated.
To use safeAreaLayoutGuide, you need to do iOS version check
if #available(iOS 11.0, *) {
headerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20)
} else {
headerView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20)
}
Maybe we can introduce a common property that can be used across many iOS versions, let’s call it compatibleSafeAreaLayoutGuide
extension UIView {
/// Use safeAreaLayoutGuide on iOS 11+, otherwise default to dummy layout guide
var compatibleSafeAreaLayoutGuide: UILayoutGuide {
if #available(iOS 11, *) {
return safeAreaLayoutGuide
} else {
if let layoutGuide = self.associatedLayoutGuide {
return layoutGuide
} else {
let layoutGuide = UILayoutGuide()
Constraint.on(
layoutGuide.topAnchor.constraint(equalTo: topAnchor),
layoutGuide.bottomAnchor.constraint(equalTo: bottomAnchor),
layoutGuide.leftAnchor.constraint(equalTo: leftAnchor),
layoutGuide.rightAnchor.constraint(equalTo: rightAnchor)
)
self.associatedLayoutGuide = layoutGuide
return layoutGuide
}
}
}
private struct AssociatedKeys {
static var layoutGuide = "layoutGuide"
}
fileprivate var associatedLayoutGuide: UILayoutGuide? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.layoutGuide) as? UILayoutGuide
}
set {
if let newValue = newValue {
objc_setAssociatedObject(
self, &AssociatedKeys.layoutGuide,
newValue as UILayoutGuide?,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC
)
}
}
}
}
This way we can simply do
headerView.topAnchor.constraint(equalTo: view.compatibleSafeAreaLayoutGuide.topAnchor, constant: 20)
Start the conversation