Skip to content

Instantly share code, notes, and snippets.

@ha1f
Last active February 8, 2018 01:27
Show Gist options
  • Save ha1f/884ce4870dc395639e86c4395f5ea947 to your computer and use it in GitHub Desktop.
Save ha1f/884ce4870dc395639e86c4395f5ea947 to your computer and use it in GitHub Desktop.
// 案1
extension UIView {
/// Returns UILayoutGuide compatible with safeAreaLayoutGuide.
/// `.safeAreaLayoutGuide` is available only iOS 11+, but safeAreaLayoutGuide
/// should be same as layoutguide of UIView under iOS 11.
///
/// - returns safeAreaLayoutGuide or layoutGuide of self
func safeLayoutGuideOrSelfLayoutGuide() -> UILayoutGuide {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide
} else {
return UIViewLayoutGuideProxy(self)
}
}
}
private final class UIViewLayoutGuideProxy: UILayoutGuide {
private unowned var _base: UIView
init(_ view: UIView) {
self._base = view
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("UIViewLayoutGuideProxy cannot be instantiated from NSCoder. Use init(UIView) instead.")
}
override var leftAnchor: NSLayoutXAxisAnchor {
return _base.leftAnchor
}
override var topAnchor: NSLayoutYAxisAnchor {
return _base.topAnchor
}
override var bottomAnchor: NSLayoutYAxisAnchor {
return _base.bottomAnchor
}
override var rightAnchor: NSLayoutXAxisAnchor {
return _base.rightAnchor
}
override var widthAnchor: NSLayoutDimension {
return _base.widthAnchor
}
override var heightAnchor: NSLayoutDimension {
return _base.heightAnchor
}
override var leadingAnchor: NSLayoutXAxisAnchor {
return _base.leadingAnchor
}
override var trailingAnchor: NSLayoutXAxisAnchor {
return _base.trailingAnchor
}
override var centerXAnchor: NSLayoutXAxisAnchor {
return _base.centerXAnchor
}
override var centerYAnchor: NSLayoutYAxisAnchor {
return _base.centerYAnchor
}
}
// 案2
extension UIView {
var safeLeftAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.leftAnchor
} else {
return leftAnchor
}
}
var safeRightAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.rightAnchor
} else {
return rightAnchor
}
}
var safeBottomAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.bottomAnchor
} else {
return bottomAnchor
}
}
var safeTopAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.topAnchor
} else {
return topAnchor
}
}
var safeWidthAnchor: NSLayoutDimension {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.widthAnchor
} else {
return widthAnchor
}
}
var safeHeightAnchor: NSLayoutDimension {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.heightAnchor
} else {
return heightAnchor
}
}
var safeCenterYAnchor: NSLayoutYAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.centerYAnchor
} else {
return centerYAnchor
}
}
var safeCenterXAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.centerXAnchor
} else {
return centerXAnchor
}
}
var safeLeadingAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.leadingAnchor
} else {
return leadingAnchor
}
}
var safeTrailingAnchor: NSLayoutXAxisAnchor {
if #available(iOS 11.0, *) {
return self.safeAreaLayoutGuide.trailingAnchor
} else {
return trailingAnchor
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment