diff --git a/Examples/UIExplorer/SliderIOSExample.js b/Examples/UIExplorer/SliderIOSExample.js index 9b3c584db..baee69ae8 100644 --- a/Examples/UIExplorer/SliderIOSExample.js +++ b/Examples/UIExplorer/SliderIOSExample.js @@ -84,10 +84,38 @@ exports.examples = [ return ; } }, + { + title: 'Custom min/max track tint color', + render(): ReactElement { + return ( + + ); + } + }, { title: 'Custom thumb image', render(): ReactElement { - return ; + return ; } - } + }, + { + title: 'Custom track image', + render(): ReactElement { + return ; + } + }, + { + title: 'Custom min/max track image', + render(): ReactElement { + return ( + + ); + } + }, ]; diff --git a/Examples/UIExplorer/UIExplorer/Images.xcassets/Contents.json b/Examples/UIExplorer/UIExplorer/Images.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Examples/UIExplorer/UIExplorer/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Examples/UIExplorer/slider-left.png b/Examples/UIExplorer/slider-left.png new file mode 100644 index 000000000..dff4e11e1 Binary files /dev/null and b/Examples/UIExplorer/slider-left.png differ diff --git a/Examples/UIExplorer/slider-left@2x.png b/Examples/UIExplorer/slider-left@2x.png new file mode 100644 index 000000000..83c6dd820 Binary files /dev/null and b/Examples/UIExplorer/slider-left@2x.png differ diff --git a/Examples/UIExplorer/slider-right.png b/Examples/UIExplorer/slider-right.png new file mode 100644 index 000000000..57e8c7d3f Binary files /dev/null and b/Examples/UIExplorer/slider-right.png differ diff --git a/Examples/UIExplorer/slider-right@2x.png b/Examples/UIExplorer/slider-right@2x.png new file mode 100644 index 000000000..8546ba8c9 Binary files /dev/null and b/Examples/UIExplorer/slider-right@2x.png differ diff --git a/Examples/UIExplorer/slider.png b/Examples/UIExplorer/slider.png new file mode 100644 index 000000000..914199101 Binary files /dev/null and b/Examples/UIExplorer/slider.png differ diff --git a/Examples/UIExplorer/slider@2x.png b/Examples/UIExplorer/slider@2x.png new file mode 100644 index 000000000..396614fa9 Binary files /dev/null and b/Examples/UIExplorer/slider@2x.png differ diff --git a/Libraries/Components/SliderIOS/SliderIOS.ios.js b/Libraries/Components/SliderIOS/SliderIOS.ios.js index aff67e6ef..fa1ed2246 100644 --- a/Libraries/Components/SliderIOS/SliderIOS.ios.js +++ b/Libraries/Components/SliderIOS/SliderIOS.ios.js @@ -78,11 +78,24 @@ var SliderIOS = React.createClass({ */ disabled: PropTypes.bool, - /** - * Sets an image for the track. It only supports images that are included as assets + /** + * Assigns a single image for the track. Only static images are supported. + * The center pixel of the image will be stretched to fill the track. */ trackImage: Image.propTypes.source, + /** + * Assigns a minimum track image. Only static images are supported. The + * rightmost pixel of the image will be stretched to fill the track. + */ + minimumTrackImage: Image.propTypes.source, + + /** + * Assigns a maximum track image. Only static images are supported. The + * leftmost pixel of the image will be stretched to fill the track. + */ + maximumTrackImage: Image.propTypes.source, + /** * Sets an image for the thumb. It only supports static images. */ @@ -107,28 +120,18 @@ var SliderIOS = React.createClass({ }, render: function() { + let {style, onValueChange, onSlidingComplete, ...props} = this.props; + props.style = [styles.slider, style]; - let onValueChange = this.props.onValueChange && ((event: Event) => { - this.props.onValueChange && - this.props.onValueChange(event.nativeEvent.value); + props.onValueChange = onValueChange && ((event: Event) => { + onValueChange && onValueChange(event.nativeEvent.value); }); - let onSlidingComplete = this.props.onSlidingComplete && ((event: Event) => { - this.props.onSlidingComplete && - this.props.onSlidingComplete(event.nativeEvent.value); + props.onSlidingComplete = onSlidingComplete && ((event: Event) => { + onSlidingComplete && onSlidingComplete(event.nativeEvent.value); }); - let {style, ...props} = this.props; - style = [styles.slider, style]; - - return ( - - ); + return ; } }); diff --git a/React/Views/RCTSlider.h b/React/Views/RCTSlider.h index 83e3d7ead..c84593c50 100644 --- a/React/Views/RCTSlider.h +++ b/React/Views/RCTSlider.h @@ -20,6 +20,9 @@ @property (nonatomic, assign) float lastValue; @property (nonatomic, strong) UIImage *trackImage; +@property (nonatomic, strong) UIImage *minimumTrackImage; +@property (nonatomic, strong) UIImage *maximumTrackImage; + @property (nonatomic, strong) UIImage *thumbImage; diff --git a/React/Views/RCTSlider.m b/React/Views/RCTSlider.m index d95f4d687..4032794eb 100644 --- a/React/Views/RCTSlider.m +++ b/React/Views/RCTSlider.m @@ -9,6 +9,8 @@ #import "RCTSlider.h" +#import + @implementation RCTSlider { float _unclippedValue; @@ -36,17 +38,46 @@ { if (trackImage != _trackImage) { _trackImage = trackImage; - - CGFloat width = trackImage.size.width; - - UIImage *minimumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){0, width, 0, 0}]; - UIImage *maximumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){0, 0, 0, width}]; - - [super setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal]; - [super setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal]; + CGFloat width = trackImage.size.width / 2; + UIImage *minimumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){ + 0, width, 0, width + } resizingMode:UIImageResizingModeStretch]; + UIImage *maximumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){ + 0, width, 0, width + } resizingMode:UIImageResizingModeStretch]; + [self setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal]; + [self setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal]; } } +- (void)setMinimumTrackImage:(UIImage *)minimumTrackImage +{ + _trackImage = nil; + minimumTrackImage = [minimumTrackImage resizableImageWithCapInsets:(UIEdgeInsets){ + 0, minimumTrackImage.size.width, 0, 0 + } resizingMode:UIImageResizingModeStretch]; + [self setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal]; +} + +- (UIImage *)minimumTrackImage +{ + return [self thumbImageForState:UIControlStateNormal]; +} + +- (void)setMaximumTrackImage:(UIImage *)maximumTrackImage +{ + _trackImage = nil; + maximumTrackImage = [maximumTrackImage resizableImageWithCapInsets:(UIEdgeInsets){ + 0, 0, 0, maximumTrackImage.size.width + } resizingMode:UIImageResizingModeStretch]; + [self setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal]; +} + +- (UIImage *)maximumTrackImage +{ + return [self thumbImageForState:UIControlStateNormal]; +} + - (void)setThumbImage:(UIImage *)thumbImage { [self setThumbImage:thumbImage forState:UIControlStateNormal]; diff --git a/React/Views/RCTSliderManager.m b/React/Views/RCTSliderManager.m index bdb89ab06..50638f2cb 100644 --- a/React/Views/RCTSliderManager.m +++ b/React/Views/RCTSliderManager.m @@ -77,6 +77,8 @@ static void RCTSendSliderEvent(RCTSlider *sender, BOOL continuous) RCT_EXPORT_VIEW_PROPERTY(value, float); RCT_EXPORT_VIEW_PROPERTY(step, float); RCT_EXPORT_VIEW_PROPERTY(trackImage, UIImage); +RCT_EXPORT_VIEW_PROPERTY(minimumTrackImage, UIImage); +RCT_EXPORT_VIEW_PROPERTY(maximumTrackImage, UIImage); RCT_EXPORT_VIEW_PROPERTY(minimumValue, float); RCT_EXPORT_VIEW_PROPERTY(maximumValue, float); RCT_EXPORT_VIEW_PROPERTY(minimumTrackTintColor, UIColor);