Skip to content

Instantly share code, notes, and snippets.

@DevAndArtist
Created September 13, 2017 20:47
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DevAndArtist/1f8e72ee5c0619c64e98445a9cbf8dd0 to your computer and use it in GitHub Desktop.
Save DevAndArtist/1f8e72ee5c0619c64e98445a9cbf8dd0 to your computer and use it in GitHub Desktop.
A layout guide for iOS 10 that is very similar to the `safeAreaLayoutGuide` from iOS 11.

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)
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment