@@ -110,6 +110,29 @@ import UIKit
110
110
111
111
private let renderer = TactileSliderLayerRenderer ( )
112
112
113
+ // gross workaround for not being able to use @available on stored properties, from https://www.klundberg.com/blog/Swift-2-and-@available-properties/
114
+ private var _minMaxFeedbackGenerator : AnyObject ?
115
+ @available ( iOS 10 . 0 , * ) private var minMaxFeedbackGenerator : UIImpactFeedbackGenerator ? {
116
+ get {
117
+ return _minMaxFeedbackGenerator as? UIImpactFeedbackGenerator
118
+ }
119
+ set ( newValue) {
120
+ _minMaxFeedbackGenerator = newValue
121
+ }
122
+ }
123
+
124
+ private var _feedbackStyle : Int ?
125
+ @available ( iOS 10 . 0 , * ) open var feedbackStyle : UIImpactFeedbackGenerator . FeedbackStyle {
126
+ get {
127
+ guard let _feedbackStyle = _feedbackStyle,
128
+ let style = UIImpactFeedbackGenerator . FeedbackStyle ( rawValue: _feedbackStyle) else { return . light }
129
+ return style
130
+ }
131
+ set ( newValue) {
132
+ _feedbackStyle = newValue. rawValue
133
+ }
134
+ }
135
+
113
136
114
137
// MARK: - Initialization
115
138
@@ -146,6 +169,10 @@ import UIKit
146
169
renderer. trackLayer. addSublayer ( renderer. thumbLayer)
147
170
148
171
updateLayerFrames ( )
172
+
173
+ if #available( iOS 10 . 0 , * ) {
174
+ feedbackStyle = . light
175
+ }
149
176
}
150
177
151
178
open func setValue( _ newValue: Float , animated: Bool ) {
@@ -194,9 +221,28 @@ import UIKit
194
221
} else if value == maximum && valueChange > 0 {
195
222
// already hit maximum, don't change the value
196
223
} else {
224
+
197
225
let newValue = value + valueChange
198
226
setValue ( newValue, animated: false )
199
227
228
+ // control feedback generator according to state
229
+ if #available( iOS 10 . 0 , * ) {
230
+ switch sender. state {
231
+ case . began:
232
+ minMaxFeedbackGenerator = UIImpactFeedbackGenerator ( style: feedbackStyle)
233
+ minMaxFeedbackGenerator? . prepare ( )
234
+ case . changed:
235
+ if newValue != value {
236
+ minMaxFeedbackGenerator? . impactOccurred ( )
237
+ minMaxFeedbackGenerator? . prepare ( )
238
+ }
239
+ case . cancelled, . ended, . failed:
240
+ _minMaxFeedbackGenerator = nil
241
+ default :
242
+ break
243
+ }
244
+ }
245
+
200
246
let remainingTranslationAmount : CGFloat
201
247
if value == newValue {
202
248
remainingTranslationAmount = 0
@@ -211,7 +257,7 @@ import UIKit
211
257
sendActions ( for: . valueChanged)
212
258
}
213
259
214
- if sender. state != . ended && sender. state != . cancelled {
260
+ if sender. state != . ended && sender. state != . cancelled && sender . state != . failed {
215
261
renderer. popUp = scaleUpWhenInUse
216
262
} else {
217
263
renderer. popUp = false
0 commit comments