Skip to content

Commit 471f372

Browse files
committed
Add safeAreaLayoutGuide support for iOS versions below 11.
1 parent 28fd717 commit 471f372

File tree

7 files changed

+73
-4
lines changed

7 files changed

+73
-4
lines changed

Layoutless.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
Pod::Spec.new do |s|
22
s.name = "Layoutless"
3-
s.version = "0.1.3"
3+
s.version = "0.1.4"
44
s.summary = "Write less UI code"
55
s.description = "Layoutless enables you to spend less time writing UI code. It provides a way to abstract common layout patterns and enable consistent styling approach."
66
s.homepage = "https://github.com/DeclarativeHub/Layoutless"
77
s.license = 'MIT'
88
s.author = { "Srdan Rasic" => "[email protected]" }
9-
s.source = { :git => "https://github.com/DeclarativeHub/Layoutless.git", :tag => "0.1.3" }
9+
s.source = { :git => "https://github.com/DeclarativeHub/Layoutless.git", :tag => "0.1.4" }
1010

1111
s.ios.deployment_target = '9.3'
1212
s.tvos.deployment_target = '11.0'

Layoutless.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
EC2870F0201E448100702624 /* Layout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2870EF201E448100702624 /* Layout.swift */; };
1515
EC2870F2201E44CE00702624 /* Layoutless+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2870F1201E44CE00702624 /* Layoutless+UIKit.swift */; };
1616
EC2870F4201E455A00702624 /* LayoutNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2870F3201E455A00702624 /* LayoutNode.swift */; };
17+
EC8287712099D56F00E371EC /* UIView+iOS10.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC8287702099D56F00E371EC /* UIView+iOS10.swift */; };
18+
EC8287722099D56F00E371EC /* UIView+iOS10.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC8287702099D56F00E371EC /* UIView+iOS10.swift */; };
1719
ECCF2CE420246CD9008099DD /* Layoutless.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECCF2CE320246CD9008099DD /* Layoutless.swift */; };
1820
ECCF2CE620246DF0008099DD /* ChildNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECCF2CE520246DF0008099DD /* ChildNode.swift */; };
1921
ECCF2D9D2024C03A008099DD /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECCF2D8D2024C03A008099DD /* Label.swift */; };
@@ -57,6 +59,7 @@
5759
EC2870EF201E448100702624 /* Layout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Layout.swift; sourceTree = "<group>"; };
5860
EC2870F1201E44CE00702624 /* Layoutless+UIKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Layoutless+UIKit.swift"; sourceTree = "<group>"; };
5961
EC2870F3201E455A00702624 /* LayoutNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutNode.swift; sourceTree = "<group>"; };
62+
EC8287702099D56F00E371EC /* UIView+iOS10.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+iOS10.swift"; sourceTree = "<group>"; };
6063
ECCF2CE320246CD9008099DD /* Layoutless.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Layoutless.swift; sourceTree = "<group>"; };
6164
ECCF2CE520246DF0008099DD /* ChildNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChildNode.swift; sourceTree = "<group>"; };
6265
ECCF2D8D2024C03A008099DD /* Label.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; };
@@ -141,6 +144,7 @@
141144
ECCF2CE520246DF0008099DD /* ChildNode.swift */,
142145
ECCF2CE320246CD9008099DD /* Layoutless.swift */,
143146
EC2870F1201E44CE00702624 /* Layoutless+UIKit.swift */,
147+
EC8287702099D56F00E371EC /* UIView+iOS10.swift */,
144148
);
145149
path = Layout;
146150
sourceTree = "<group>";
@@ -300,6 +304,7 @@
300304
EC2870EE201E446900702624 /* LayoutProtocol.swift in Sources */,
301305
ECCF2DA22024C03A008099DD /* TextField.swift in Sources */,
302306
ECCF2DA32024C03A008099DD /* ImageView.swift in Sources */,
307+
EC8287712099D56F00E371EC /* UIView+iOS10.swift in Sources */,
303308
ECCF2D9D2024C03A008099DD /* Label.swift in Sources */,
304309
EC2870F4201E455A00702624 /* LayoutNode.swift in Sources */,
305310
ECCF2D9E2024C03A008099DD /* ViewController.swift in Sources */,
@@ -325,6 +330,7 @@
325330
ECCF2E0F20274F82008099DD /* Anchorable.swift in Sources */,
326331
ECCF2E0E20274F82008099DD /* Length.swift in Sources */,
327332
ECCF2E1220274F82008099DD /* Layout.swift in Sources */,
333+
EC8287722099D56F00E371EC /* UIView+iOS10.swift in Sources */,
328334
ECCF2E1020274F82008099DD /* LayoutNode.swift in Sources */,
329335
ECCF2E1820274F88008099DD /* Label.swift in Sources */,
330336
ECCF2E1A20274F88008099DD /* TextField.swift in Sources */,

Layoutless/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<key>CFBundlePackageType</key>
1616
<string>FMWK</string>
1717
<key>CFBundleShortVersionString</key>
18-
<string>0.1.3</string>
18+
<string>0.1.4</string>
1919
<key>CFBundleVersion</key>
2020
<string>$(CURRENT_PROJECT_VERSION)</string>
2121
<key>NSPrincipalClass</key>

Sources/Layout/Layoutless.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ extension LayoutProtocol where LayoutNode: Anchorable {
5151
if #available(iOS 11.0, *), safeArea {
5252
layout(parent.safeAreaLayoutGuide, node)
5353
} else {
54-
layout(parent, node)
54+
layout(parent.___safeAreaLayoutGuide, node)
5555
}
5656
}
5757
}

Sources/Layout/UIView+iOS10.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// UIView+iOS10.swift
3+
// Layoutless
4+
//
5+
// Created by Srdan Rasic on 02/05/2018.
6+
// Copyright © 2018 Declarative Hub. All rights reserved.
7+
//
8+
9+
import UIKit
10+
11+
extension UIView {
12+
13+
private struct AssociatedKeys {
14+
static var safeAreaLayoutGuide = "safeAreaLayoutGuide"
15+
}
16+
17+
internal var ___safeAreaLayoutGuide: UILayoutGuide {
18+
get {
19+
let layoutGuide = objc_getAssociatedObject(self, &AssociatedKeys.safeAreaLayoutGuide) as? UILayoutGuide
20+
if let layoutGuide = layoutGuide {
21+
return layoutGuide
22+
} else {
23+
let layoutGuide = UILayoutGuide()
24+
addLayoutGuide(layoutGuide)
25+
NSLayoutConstraint.activate([
26+
layoutGuide.leadingAnchor.constraint(equalTo: leadingAnchor),
27+
layoutGuide.trailingAnchor.constraint(equalTo: trailingAnchor)
28+
])
29+
objc_setAssociatedObject(self, &AssociatedKeys.safeAreaLayoutGuide, layoutGuide, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
30+
return layoutGuide
31+
}
32+
}
33+
}
34+
}

Sources/Views/View.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,19 @@ open class View: UIView {
6060
open var subviewsLayout: AnyLayout {
6161
return EmptyLayout()
6262
}
63+
64+
open override func didMoveToSuperview() {
65+
super.didMoveToSuperview()
66+
67+
guard let superview = superview else { return }
68+
69+
if #available(iOS 11.0, *) {
70+
// safeAreaLayoutGuide is already available
71+
} else {
72+
NSLayoutConstraint.activate([
73+
___safeAreaLayoutGuide.topAnchor.constraint(equalTo: superview.___safeAreaLayoutGuide.topAnchor),
74+
___safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: superview.___safeAreaLayoutGuide.bottomAnchor)
75+
])
76+
}
77+
}
6378
}

Sources/Views/ViewController.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ open class ViewController: UIViewController {
3838

3939
open override func viewDidLoad() {
4040
super.viewDidLoad()
41+
42+
if #available(iOS 11.0, *) {
43+
// safeAreaLayoutGuide is already available
44+
} else {
45+
setupSafeAreaLayoutGuideFallback()
46+
}
47+
4148
defineLayout()
4249
}
4350

@@ -51,4 +58,11 @@ open class ViewController: UIViewController {
5158
open var subviewsLayout: AnyLayout {
5259
return EmptyLayout()
5360
}
61+
62+
private func setupSafeAreaLayoutGuideFallback() {
63+
NSLayoutConstraint.activate([
64+
view.___safeAreaLayoutGuide.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor),
65+
view.___safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor)
66+
])
67+
}
5468
}

0 commit comments

Comments
 (0)