Skip to content

Commit e409e20

Browse files
i1sknfacebook-github-bot-4
authored andcommitted
Step support for SliderIOS
Summary: Add step support to SliderIOS Closes facebook/react-native#3746 Reviewed By: svcscm Differential Revision: D2595360 Pulled By: nicklockwood fb-gh-sync-id: 4adf8bcdf46c709776d779244ba3de2b40eb27d6
1 parent c16ffd3 commit e409e20

3 files changed

Lines changed: 31 additions & 2 deletions

File tree

Libraries/Components/SliderIOS/SliderIOS.ios.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ var SliderIOS = React.createClass({
4141
*/
4242
value: PropTypes.number,
4343

44+
/**
45+
* Step value of the slider. The value should be
46+
* between 0 and (maximumValue - minimumValue).
47+
* Default value is 0.
48+
*/
49+
step: PropTypes.number,
50+
4451
/**
4552
* Initial minimum value of the slider. Default value is 0.
4653
*/
@@ -103,6 +110,7 @@ var SliderIOS = React.createClass({
103110
<RCTSlider
104111
style={[styles.slider, this.props.style]}
105112
value={this.props.value}
113+
step={this.props.step}
106114
maximumValue={this.props.maximumValue}
107115
minimumValue={this.props.minimumValue}
108116
minimumTrackTintColor={this.props.minimumTrackTintColor}

React/Views/RCTSlider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@
1414
@interface RCTSlider : UISlider
1515

1616
@property (nonatomic, copy) RCTBubblingEventBlock onChange;
17+
@property (nonatomic, assign) float step;
18+
@property (nonatomic, assign) float lastValue;
1719

1820
@end

React/Views/RCTSliderManager.m

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,30 @@ - (UIView *)view
3030

3131
static void RCTSendSliderEvent(RCTSlider *sender, BOOL continuous)
3232
{
33-
if (sender.onChange) {
33+
float value = sender.value;
34+
35+
if (sender.step > 0 &&
36+
sender.step <= (sender.maximumValue - sender.minimumValue)) {
37+
value =
38+
MAX(sender.minimumValue,
39+
MIN(sender.maximumValue,
40+
sender.minimumValue + round((sender.value - sender.minimumValue) / sender.step) * sender.step
41+
)
42+
);
43+
}
44+
45+
if (!continuous) {
46+
sender.value = value;
47+
}
48+
49+
if (sender.onChange && (sender.lastValue != value || !continuous)) {
3450
sender.onChange(@{
35-
@"value": @(sender.value),
51+
@"value": @(value),
3652
@"continuous": @(continuous),
3753
});
3854
}
55+
56+
sender.lastValue = value;
3957
}
4058

4159
- (void)sliderValueChanged:(RCTSlider *)sender
@@ -49,6 +67,7 @@ - (void)sliderTouchEnd:(RCTSlider *)sender
4967
}
5068

5169
RCT_EXPORT_VIEW_PROPERTY(value, float);
70+
RCT_EXPORT_VIEW_PROPERTY(step, float);
5271
RCT_EXPORT_VIEW_PROPERTY(minimumValue, float);
5372
RCT_EXPORT_VIEW_PROPERTY(maximumValue, float);
5473
RCT_EXPORT_VIEW_PROPERTY(minimumTrackTintColor, UIColor);

0 commit comments

Comments
 (0)