-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MainViewController+Layout.swift
127 lines (100 loc) · 4.11 KB
/
MainViewController+Layout.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file,
// You can obtain one at http://mozilla.org/MPL/2.0/.
import UIKit
import MapKit
import SnapKit
// swiftlint:disable force_unwrapping
// ^^^ We have a lot of view thingies to unwrap
extension MainViewController {
internal func initLayout() {
self.initMapView()
self.initToolbarView()
self.initToolbarButtons()
}
// MARK: - Map
private func initMapView() {
self.addChild(self.map)
let mapView = self.map.view!
// Ignore safeAreaLayoutGuide, so we are under status bar and toolbar
self.view.addSubview(mapView)
mapView.snp.makeConstraints { $0.edges.equalToSuperview() }
self.map.didMove(toParent: self)
}
// MARK: - Toolbar
private var buttonSize: CGSize {
return Constants.toolbarButtonSize
}
private var buttonImageSize: CGSize {
return Constants.toolbarButtonImageSize
}
private func initToolbarView() {
self.toolbar.contentView.addTopBorder()
// 'stackView' is responsible for an actual frame on iPhone X and newer
// (it has constraint to safe area).
self.view.addSubview(self.toolbar)
self.toolbar.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
}
}
// MARK: - Toolbar button
// swiftlint:disable:next function_body_length
private func initToolbarButtons() {
let buttonColor = ColorScheme.tint
self.userTrackingButton.mapView = self.map.mapView
let userTrackingButtonView = self.userTrackingButton.customView!
userTrackingButtonView.tintColor = buttonColor
self.setSize(view: userTrackingButtonView, to: self.buttonSize)
self.customizeButton(self.searchButton,
image: ImageAsset.toolbarTram,
color: buttonColor,
action: #selector(searchButtonPressed))
self.customizeButton(self.bookmarksButton,
image: ImageAsset.toolbarHeart,
color: buttonColor,
action: #selector(bookmarksButtonPressed))
self.customizeButton(self.notificationsButton,
image: ImageAsset.toolbarBell,
color: buttonColor,
action: #selector(notificationsButtonPressed))
self.customizeButton(self.configurationButton,
image: ImageAsset.toolbarGear,
color: buttonColor,
action: #selector(settingsButtonPressed))
self.toolbarStackView.addArrangedSubview(userTrackingButtonView)
self.toolbarStackView.addArrangedSubview(self.searchButton)
self.toolbarStackView.addArrangedSubview(self.bookmarksButton)
self.toolbarStackView.addArrangedSubview(self.notificationsButton)
self.toolbarStackView.addArrangedSubview(self.configurationButton)
self.toolbarStackView.axis = .horizontal
self.toolbarStackView.distribution = .equalCentering
self.toolbar.contentView.addSubview(self.toolbarStackView)
self.toolbarStackView.snp.makeConstraints { make in
make.top.equalToSuperview()
make.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom)
make.left.equalToSuperview()
make.right.equalToSuperview()
}
}
private func customizeButton(_ button: UIButton,
image: ImageAsset,
color: UIColor,
action: Selector) {
button.tintColor = color
button.setImage(image.value, for: .normal)
button.addTarget(self, action: action, for: .touchUpInside)
guard let imageView = button.imageView else {
fatalError("Unable to get toolbar button imageView")
}
button.contentVerticalAlignment = .center
button.contentHorizontalAlignment = .center
self.setSize(view: button, to: self.buttonSize)
self.setSize(view: imageView, to: self.buttonImageSize)
}
private func setSize(view: UIView, to size: CGSize) {
view.snp.makeConstraints { make in
make.width.equalTo(size.width)
make.height.equalTo(size.height)
}
}
}