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);