Commit 325b21e7 by Dmitriy Stepanets

Processing SettingsController layout

parent 44b939ed
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<key>1Weather.xcscheme_^#shared#^_</key> <key>1Weather.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>5</integer> <integer>6</integer>
</dict> </dict>
<key>PG (Playground) 1.xcscheme</key> <key>PG (Playground) 1.xcscheme</key>
<dict> <dict>
......
...@@ -112,3 +112,8 @@ ...@@ -112,3 +112,8 @@
"settings.theme.automaticDesc" = "Enable light or dark theme based on your device brightness and display settings"; "settings.theme.automaticDesc" = "Enable light or dark theme based on your device brightness and display settings";
"settings.theme.light" = "Light"; "settings.theme.light" = "Light";
"settings.theme.dark" = "Dark"; "settings.theme.dark" = "Dark";
"settings.theme" = "Theme";
"settings.unit.temp" = "Temperature";
"settings.unit.wind" = "Wind";
"settings.unit.pressure" = "Pressure";
"settings.unit.distance" = "Distance";
...@@ -7,11 +7,6 @@ ...@@ -7,11 +7,6 @@
import UIKit import UIKit
private enum Section {
case settings
case info
}
public enum MenuRow { public enum MenuRow {
case settings case settings
case about case about
...@@ -79,6 +74,11 @@ public enum MenuRow { ...@@ -79,6 +74,11 @@ public enum MenuRow {
} }
} }
private enum Section {
case settings
case info
}
private struct SectionItem { private struct SectionItem {
let type:Section let type:Section
let rows:[MenuRow] let rows:[MenuRow]
......
...@@ -8,4 +8,105 @@ ...@@ -8,4 +8,105 @@
import UIKit import UIKit
class SettingsCell: UITableViewCell { class SettingsCell: UITableViewCell {
//Private
private let container = UIView()
private let settingsNameLabel = UILabel()
private let selectedValueLabel = UILabel()
private let arrowLabel = UILabel()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
prepareCell()
prepareContainer()
prepareLabels()
updateUI()
}
func configure(settingsName:String, selectedValue:String, roundCorners:CACornerMask) {
settingsNameLabel.text = settingsName
selectedValueLabel.text = selectedValue
if roundCorners.isEmpty {
container.layer.cornerRadius = 0
}
else {
container.layer.cornerRadius = 12
container.layer.maskedCorners = roundCorners
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateUI()
}
private func updateUI() {
contentView.backgroundColor = ThemeManager.currentTheme.baseBackgroundColor
container.backgroundColor = ThemeManager.currentTheme.containerBackgroundColor
switch interfaceStyle {
case .light:
settingsNameLabel.textColor = ThemeManager.currentTheme.secondaryTextColor
selectedValueLabel.textColor = ThemeManager.currentTheme.secondaryTextColor
arrowLabel.textColor = ThemeManager.currentTheme.secondaryTextColor
case .dark:
settingsNameLabel.textColor = ThemeManager.currentTheme.primaryTextColor
selectedValueLabel.textColor = ThemeManager.currentTheme.primaryTextColor
arrowLabel.textColor = ThemeManager.currentTheme.primaryTextColor
}
}
}
//MARK:- Prepare
private extension SettingsCell {
func prepareCell() {
selectionStyle = .none
}
func prepareContainer() {
contentView.addSubview(container)
container.snp.makeConstraints { (make) in
make.top.bottom.equalToSuperview()
make.left.right.equalToSuperview().inset(18)
}
}
func prepareLabels() {
settingsNameLabel.font = AppFont.SFPro.bold(size: 16)
settingsNameLabel.textAlignment = .left
container.addSubview(settingsNameLabel)
selectedValueLabel.font = AppFont.SFPro.regular(size: 16)
selectedValueLabel.textAlignment = .right
container.addSubview(selectedValueLabel)
arrowLabel.font = AppFont.SFPro.regular(size: 18)
arrowLabel.textAlignment = .right
arrowLabel.text = "􀆊"
container.addSubview(arrowLabel)
//Constraints
settingsNameLabel.snp.makeConstraints { (make) in
make.left.equalToSuperview().inset(18)
make.centerY.equalToSuperview()
make.top.bottom.equalToSuperview().inset(18)
}
arrowLabel.snp.makeConstraints { (make) in
make.right.equalToSuperview().inset(18)
make.centerY.equalToSuperview()
}
selectedValueLabel.snp.makeConstraints { (make) in
make.right.equalTo(arrowLabel.snp.left).inset(-8)
make.centerY.equalToSuperview()
}
}
} }
...@@ -7,18 +7,59 @@ ...@@ -7,18 +7,59 @@
import UIKit import UIKit
private enum SettingsRow { public enum SettingsRow {
case theme case theme
case temperature
case wind
case pressure
case distance
var roundedCorners:CACornerMask {
switch self {
case .theme:
return [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner, .layerMaxXMinYCorner]
case .temperature:
return [.layerMinXMinYCorner, .layerMaxXMinYCorner]
case .distance:
return [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
default:
return []
}
}
var localizedName:String {
switch self {
case .theme:
return "settings.theme".localized()
case .temperature:
return "settings.unit.temp".localized()
case .wind:
return "settings.unit.wind".localized()
case .pressure:
return "settings.unit.pressure".localized()
case .distance:
return "settings.unit.distance".localized()
}
}
} }
private struct Section { public enum SettingsSection {
case theme
case units
case language
case other
}
private struct SettingsDataSource {
let section:SettingsSection
let rows:[SettingsRow] let rows:[SettingsRow]
} }
class SettingsCellFactory: CellFactoryProtocol { class SettingsCellFactory: CellFactoryProtocol {
//Private //Private
private let viewModel:SettingsViewModel private let viewModel:SettingsViewModel
private let sections:[Section] = [Section(rows: [.theme])] private let sections:[SettingsDataSource] = [SettingsDataSource(section: .theme, rows: [.theme]),
SettingsDataSource(section: .units, rows: [.temperature, .wind, .pressure, .distance])]
//Public //Public
init(viewModel:SettingsViewModel) { init(viewModel:SettingsViewModel) {
...@@ -35,9 +76,23 @@ class SettingsCellFactory: CellFactoryProtocol { ...@@ -35,9 +76,23 @@ class SettingsCellFactory: CellFactoryProtocol {
public func registerCells(on tableView: UITableView) { public func registerCells(on tableView: UITableView) {
self.registerCell(type: SettingsThemeCell.self, tableView: tableView) self.registerCell(type: SettingsThemeCell.self, tableView: tableView)
self.registerCell(type: SettingsCell.self, tableView: tableView)
} }
public func cellFromTableView(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell { public func cellFromTableView(tableView: UITableView, indexPath: IndexPath) -> UITableViewCell {
let type = sections[indexPath.section].rows[indexPath.row]
switch type {
case .theme:
return self.dequeueReusableCell(type: SettingsThemeCell.self, tableView: tableView, indexPath: indexPath) return self.dequeueReusableCell(type: SettingsThemeCell.self, tableView: tableView, indexPath: indexPath)
default:
let cell = self.dequeueReusableCell(type: SettingsCell.self, tableView: tableView, indexPath: indexPath)
cell.configure(settingsName: type.localizedName, selectedValue: "Some", roundCorners: type.roundedCorners)
return cell
}
}
public func sectionTypeAt(indexPath:IndexPath) -> SettingsSection {
return sections[indexPath.section].section
} }
} }
...@@ -64,6 +64,7 @@ private extension SettingsViewController { ...@@ -64,6 +64,7 @@ private extension SettingsViewController {
func prepareTableView() { func prepareTableView() {
settingsCellFactory.registerCells(on: tableView) settingsCellFactory.registerCells(on: tableView)
tableView.separatorStyle = .none
tableView.dataSource = self tableView.dataSource = self
tableView.separatorStyle = .none tableView.separatorStyle = .none
tableView.tableFooterView = UIView() tableView.tableFooterView = UIView()
...@@ -91,3 +92,28 @@ extension SettingsViewController: UITableViewDataSource { ...@@ -91,3 +92,28 @@ extension SettingsViewController: UITableViewDataSource {
return settingsCellFactory.cellFromTableView(tableView: tableView, indexPath: indexPath) return settingsCellFactory.cellFromTableView(tableView: tableView, indexPath: indexPath)
} }
} }
//MARK:- UITableView Delegate
extension SettingsViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
switch settingsCellFactory.sectionTypeAt(indexPath: [section, 0]) {
case .theme, .units:
let view = UIView()
let label = UILabel()
view.backgroundColor = ThemeManager.currentTheme.baseBackgroundColor
label.font = AppFont.SFPro.bold(size: 18)
view.snp.makeConstraints { (make) in
make.height.equalTo(24)
}
return view
default:
return nil
}
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableView.automaticDimension
}
}
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<key>Cirque.xcscheme_^#shared#^_</key> <key>Cirque.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>3</integer> <integer>4</integer>
</dict> </dict>
<key>Localize-Swift.xcscheme</key> <key>Localize-Swift.xcscheme</key>
<dict> <dict>
...@@ -40,19 +40,19 @@ ...@@ -40,19 +40,19 @@
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>2</integer> <integer>1</integer>
</dict> </dict>
<key>SnapKit.xcscheme</key> <key>SnapKit.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key> <key>orderHint</key>
<integer>3</integer> <integer>2</integer>
</dict> </dict>
<key>XMLCoder.xcscheme_^#shared#^_</key> <key>XMLCoder.xcscheme_^#shared#^_</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>
<integer>6</integer> <integer>3</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment