A layout guide for iOS 10 that is very similar to the safeAreaLayoutGuide
from iOS 11.
extension UIView {
///
private final class LayoutGuide : UILayoutGuide {}
///
var guardedAreaLayoutGuide: UILayoutGuide {
if #available(iOS 11, *) {
return safeAreaLayoutGuide
}
guard
let appDelegate = UIApplication.shared.delegate,
let rootViewController = appDelegate.window??.rootViewController
else { fatalError("Do not access this property without a root view controller.") }
let view: UIView = rootViewController.view
let layoutGuides = view.layoutGuides.flatMap { $0 as? LayoutGuide }
if let existingLayoutGuide = layoutGuides.first {
return existingLayoutGuide
} else {
let layoutGuide = LayoutGuide { $0.identifier = "guardedAreaLayoutGuide" }
view.addLayoutGuide(layoutGuide)
NSLayoutConstraint.activate(
layoutGuide.topAnchor.constraint(equalTo: rootViewController.topLayoutGuide.bottomAnchor),
layoutGuide.bottomAnchor.constraint(equalTo: rootViewController.bottomLayoutGuide.topAnchor),
layoutGuide.leadingAnchor.constraint(equalTo: view.leadingAnchor),
layoutGuide.trailingAnchor.constraint(equalTo: view.trailingAnchor)
)
return layoutGuide
}
}
}
Additional extensions:
extension NSLayoutConstraint {
///
static func activate(_ constraints: NSLayoutConstraint...) {
NSLayoutConstraint.activate(constraints)
}
}
protocol ConfigurableObject : class {}
extension ConfigurableObject {
///
@discardableResult
func `do`(_ closure: (Self) -> Void) -> Self {
closure(self)
return self
}
}
extension ConfigurableObject where Self : NSObject {
///
@discardableResult
init(_ configureClosure: (Self) -> Void) {
self.init()
configureClosure(self)
}
}