@@ -19,18 +19,23 @@ class LayoutDesignerOptionCell: UITableViewCell, NibBased {
19
19
}
20
20
21
21
@IBOutlet private weak var label : UILabel !
22
- @IBOutlet private weak var slider1 : UISlider !
23
- @IBOutlet private weak var input1 : UITextField !
24
- @IBOutlet private weak var slider2 : UISlider !
25
- @IBOutlet private weak var input2 : UITextField !
22
+ @IBOutlet private weak var singleSlider : UISlider !
23
+ @IBOutlet private weak var singleSliderInput : UITextField !
24
+ @IBOutlet private weak var doubleSliderStackView : UIStackView !
25
+ @IBOutlet private weak var doubleSlider1 : UISlider !
26
+ @IBOutlet private weak var doubleSliderInput1 : UITextField !
27
+ @IBOutlet private weak var doubleSlider2 : UISlider !
28
+ @IBOutlet private weak var doubleSliderInput2 : UITextField !
26
29
@IBOutlet private weak var segmentedControl : UISegmentedControl !
30
+ @IBOutlet private weak var nilLabel : UILabel !
27
31
@IBOutlet private weak var switchView : UISwitch !
28
- private var equalWidthConstraint : NSLayoutConstraint ?
29
32
30
- private var onSlider1Change : ( CGFloat ) -> Void = { _ in }
31
- private var onInput1Change : ( CGFloat ) -> Void = { _ in }
32
- private var onSlider2Change : ( CGFloat ) -> Void = { _ in }
33
- private var onInput2Change : ( CGFloat ) -> Void = { _ in }
33
+ private var onSingleSliderChange : ( CGFloat ) -> Void = { _ in }
34
+ private var onSingleSliderInputChange : ( CGFloat ) -> Void = { _ in }
35
+ private var onDoubleSlider1Change : ( CGFloat ) -> Void = { _ in }
36
+ private var onDoubleSliderInput1Change : ( CGFloat ) -> Void = { _ in }
37
+ private var onDoubleSlider2Change : ( CGFloat ) -> Void = { _ in }
38
+ private var onDoubleSliderInput2Change : ( CGFloat ) -> Void = { _ in }
34
39
private var onSwitchChange : ( Bool ) -> Void = { _ in }
35
40
private var onSelectedSegmentChange : ( Int ) -> Void = { _ in }
36
41
@@ -49,14 +54,15 @@ class LayoutDesignerOptionCell: UITableViewCell, NibBased {
49
54
private func setupViews( ) {
50
55
backgroundColor = . clear
51
56
label. textColor = UIColor . white. withAlphaComponent ( 0.7 )
52
- [ slider1, slider2] . forEach {
57
+ nilLabel. textColor = UIColor . white. withAlphaComponent ( 0.7 )
58
+ [ singleSlider, doubleSlider1, doubleSlider2] . forEach {
53
59
$0? . tintColor = . white
54
60
$0? . thumbTintColor = . white
55
61
$0? . maximumTrackTintColor = UIColor . white. withAlphaComponent ( 0.3 )
56
62
$0? . minimumTrackTintColor = . white
57
63
$0? . addTarget ( self , action: #selector( onSliderChange ( slider: ) ) , for: . valueChanged)
58
64
}
59
- [ input1 , input2 ] . forEach {
65
+ [ singleSliderInput , doubleSliderInput1 , doubleSliderInput2 ] . forEach {
60
66
$0? . backgroundColor = . white
61
67
$0? . textAlignment = . center
62
68
$0? . layer. cornerRadius = 8
@@ -93,68 +99,93 @@ class LayoutDesignerOptionCell: UITableViewCell, NibBased {
93
99
94
100
private func onSliderChange( slider: UISlider , fromInput: Bool ) {
95
101
let value = CGFloat ( slider. value)
96
- if slider == slider1, !( slider1. value == Float ( value) && fromInput) {
97
- onSlider1Change ( value)
98
- onInputChange ( input: input1, fromSlider: true )
99
- input1. set ( value: value)
100
- } else if slider == slider2, !( slider2. value == Float ( value) && fromInput) {
101
- onSlider2Change ( value)
102
- onInputChange ( input: input2, fromSlider: true )
103
- input2. set ( value: value)
102
+ if slider == singleSlider, !( singleSlider. value == Float ( value) && fromInput) {
103
+ onSingleSliderChange ( value)
104
+ onInputChange ( input: singleSliderInput, fromSlider: true )
105
+ singleSliderInput. set ( value: value)
106
+ } else if slider == doubleSlider1, !( doubleSlider1. value == Float ( value) && fromInput) {
107
+ onDoubleSlider1Change ( value)
108
+ onInputChange ( input: doubleSliderInput1, fromSlider: true )
109
+ doubleSliderInput1. set ( value: value)
110
+ } else if slider == doubleSlider2, !( doubleSlider2. value == Float ( value) && fromInput) {
111
+ onDoubleSlider2Change ( value)
112
+ onInputChange ( input: doubleSliderInput2, fromSlider: true )
113
+ doubleSliderInput2. set ( value: value)
104
114
}
105
115
}
106
116
107
117
private func onInputChange( input: UITextField , fromSlider: Bool ) {
108
118
let value = input. floatValue
109
- if input == input1, !( input1. floatValue == value && fromSlider) {
110
- onInput1Change ( CGFloat ( value) )
111
- onSliderChange ( slider: slider1, fromInput: true )
112
- slider1. value = value
113
- } else if input == input2, !( input2. floatValue == value && fromSlider) {
114
- onInput2Change ( CGFloat ( value) )
115
- onSliderChange ( slider: slider2, fromInput: true )
116
- slider2. value = value
119
+ if input == singleSliderInput, !( singleSliderInput. floatValue == value && fromSlider) {
120
+ onSingleSliderInputChange ( CGFloat ( value) )
121
+ onSliderChange ( slider: singleSlider, fromInput: true )
122
+ singleSlider. value = value
123
+ } else if input == doubleSliderInput1, !( doubleSliderInput1. floatValue == value && fromSlider) {
124
+ onDoubleSliderInput1Change ( CGFloat ( value) )
125
+ onSliderChange ( slider: doubleSlider1, fromInput: true )
126
+ doubleSlider1. value = value
127
+ } else if input == doubleSliderInput2, !( doubleSliderInput2. floatValue == value && fromSlider) {
128
+ onDoubleSliderInput2Change ( CGFloat ( value) )
129
+ onSliderChange ( slider: doubleSlider2, fromInput: true )
130
+ doubleSlider2. value = value
117
131
}
118
132
}
119
133
120
134
private func updateViews( ) {
121
135
guard let viewModel = viewModel, label != nil else { return }
122
136
123
137
label. text = viewModel. title
124
- slider1. isHidden = true
125
- input1. isHidden = true
126
- slider2. isHidden = true
127
- input2. isHidden = true
138
+ singleSlider. isHidden = true
139
+ singleSliderInput. isHidden = true
140
+ doubleSliderStackView. isHidden = true
128
141
segmentedControl. isHidden = true
129
142
switchView. isHidden = true
130
- equalWidthConstraint? . isActive = false
131
- slider2. superview? . isHidden = true
143
+ nilLabel. isHidden = true
132
144
133
145
switch viewModel. kind {
134
146
135
- case let . singleSlider( current, onChange) :
136
- slider1. isHidden = false
137
- input1. isHidden = false
138
- input1. set ( value: current ?? 0 )
139
- slider1. value = Float ( current ?? 0 )
140
- onSlider1Change = onChange
147
+ case let . singleSlider( current, optional, onChange) :
148
+ singleSlider. isHidden = false
149
+ singleSliderInput. isHidden = false
150
+ singleSliderInput. set ( value: current ?? 0 )
151
+ singleSlider. value = Float ( current ?? 0 )
152
+ onSingleSliderChange = onChange
153
+ if optional {
154
+ switchView. isHidden = false
155
+ switchView. isOn = current == nil
156
+ nilLabel. isHidden = false
157
+ onSwitchChange = { [ weak self] in
158
+ guard let self = self else { return }
159
+ onChange ( $0 ? nil : CGFloat ( self . singleSlider. value) )
160
+ self . singleSlider. isHidden = $0
161
+ self . singleSliderInput. isHidden = $0
162
+ }
163
+ onSwitchChange ( switchView. isOn)
164
+ }
165
+
166
+ case let . doubleSlider( current, optional, onChange) :
167
+ doubleSliderStackView. isHidden = false
168
+ doubleSliderStackView. alpha = 1
169
+ doubleSliderInput1. set ( value: current? . 0 ?? 0 )
170
+ doubleSlider1. value = Float ( current? . 0 ?? 0 )
171
+ doubleSliderInput2. set ( value: current? . 1 ?? 0 )
172
+ doubleSlider2. value = Float ( current? . 1 ?? 0 )
173
+ let getValues = { [ weak self] in self . map { ( CGFloat ( $0. doubleSlider1. value) , CGFloat ( $0. doubleSlider2. value) ) } }
174
+
175
+ onDoubleSlider1Change = { _ in onChange ( getValues ( ) ) }
176
+ onDoubleSlider2Change = { _ in onChange ( getValues ( ) ) }
177
+ if optional {
178
+ switchView. isHidden = false
179
+ switchView. isOn = current == nil
180
+ nilLabel. isHidden = false
181
+ onSwitchChange = { [ weak self] in
182
+ guard let self = self else { return }
183
+ onChange ( $0 ? nil : getValues ( ) )
184
+ self . doubleSliderStackView. alpha = $0 ? 0 : 1
185
+ }
186
+ onSwitchChange ( switchView. isOn)
187
+ }
141
188
142
- case let . doubleSlider( current, onChange) :
143
- equalWidthConstraint = slider1. widthAnchor. constraint ( equalTo: slider2. widthAnchor, multiplier: 1 )
144
- equalWidthConstraint? . isActive = true
145
- slider1. isHidden = false
146
- input1. isHidden = false
147
- slider2. superview? . isHidden = false
148
- input1. set ( value: current? . 0 ?? 0 )
149
- slider1. value = Float ( current? . 0 ?? 0 )
150
- slider2. isHidden = false
151
- input2. isHidden = false
152
- input2. set ( value: current? . 1 ?? 0 )
153
- slider2. value = Float ( current? . 1 ?? 0 )
154
- onSlider1Change = { [ weak self] in onChange ( ( $0, CGFloat ( self ? . slider2. value ?? 0 ) ) ) }
155
- onSlider2Change = { [ weak self] in onChange ( ( CGFloat ( self ? . slider1. value ?? 0 ) , $0) ) }
156
- onInput1Change = { [ weak self] in onChange ( ( $0, CGFloat ( self ? . input2. floatValue ?? 0 ) ) ) }
157
- onInput2Change = { [ weak self] in onChange ( ( CGFloat ( self ? . input1. floatValue ?? 0 ) , $0) ) }
158
189
159
190
case let . toggleSwitch( current, onChange) :
160
191
switchView. isHidden = false
@@ -168,7 +199,7 @@ class LayoutDesignerOptionCell: UITableViewCell, NibBased {
168
199
segmentedControl. insertSegment ( withTitle: $0, at: 0 , animated: false )
169
200
}
170
201
onSelectedSegmentChange = { onChange ( options [ $0] ) }
171
- if let current = current , let index = options. firstIndex ( of: current) {
202
+ if let index = options. firstIndex ( of: current) {
172
203
segmentedControl. selectedSegmentIndex = index
173
204
}
174
205
}
0 commit comments