Skip to content

Commit

Permalink
[SliderIOS] Apply value after minimum/maximumValue in order to ensure…
Browse files Browse the repository at this point in the history
… it is properly set

Summary:
`value` is clamped between min/max and so order of prop application matters - `value` always ended up being set first in my tests, and consequently a value outside of the default range 0-1 would not work. So this applies the value when the min/max are set.

[Gist of broken example](https://gist.github.com/brentvatne/fc637b3e21d012966f3a)

![screenshot](http://url.brentvatne.ca/SQPC.png)
^ the second slider here should have it's cursor in the middle

/cc @tadeuzagallo
Closes facebook/react-native#835
Github Author: Brent Vatne <brent.vatne@madriska.com>

Test Plan: Imported from GitHub, without a `Test Plan:` line.
  • Loading branch information
Brent Vatne committed Apr 21, 2015
1 parent f1d1c7d commit 8d15abe
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 10 deletions.
14 changes: 14 additions & 0 deletions RCTSlider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/

#import <UIKit/UIKit.h>

@interface RCTSlider : UISlider

@end
35 changes: 35 additions & 0 deletions RCTSlider.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/

#import "RCTSlider.h"

@implementation RCTSlider
{
float _unclippedValue;
}

- (void)setValue:(float)value
{
_unclippedValue = value;
super.value = value;
}

- (void)setMinimumValue:(float)minimumValue
{
super.minimumValue = minimumValue;
super.value = _unclippedValue;
}

- (void)setMaximumValue:(float)maximumValue
{
super.maximumValue = maximumValue;
super.value = _unclippedValue;
}

@end
20 changes: 10 additions & 10 deletions RCTSliderManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#import "RCTBridge.h"
#import "RCTEventDispatcher.h"
#import "RCTSlider.h"
#import "UIView+React.h"

@implementation RCTSliderManager
Expand All @@ -19,32 +20,31 @@ @implementation RCTSliderManager

- (UIView *)view
{
UISlider *slider = [[UISlider alloc] init];
RCTSlider *slider = [[RCTSlider alloc] init];
[slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged];
[slider addTarget:self action:@selector(sliderTouchEnd:) forControlEvents:UIControlEventTouchUpInside];
return slider;
}

- (void)sliderValueChanged:(UISlider *)sender
static void RCTSendSliderEvent(RCTSliderManager *self, UISlider *sender, BOOL continuous)
{
NSDictionary *event = @{
@"target": sender.reactTag,
@"value": @(sender.value),
@"continuous": @YES,
@"continuous": @(continuous),
};

[self.bridge.eventDispatcher sendInputEventWithName:@"topChange" body:event];
}

- (void)sliderTouchEnd:(UISlider *)sender
- (void)sliderValueChanged:(UISlider *)sender
{
NSDictionary *event = @{
@"target": sender.reactTag,
@"value": @(sender.value),
@"continuous": @NO,
};
RCTSendSliderEvent(self, sender, YES);
}

[self.bridge.eventDispatcher sendInputEventWithName:@"topChange" body:event];
- (void)sliderTouchEnd:(UISlider *)sender
{
RCTSendSliderEvent(self, sender, NO);
}

RCT_EXPORT_VIEW_PROPERTY(value, float);
Expand Down

0 comments on commit 8d15abe

Please sign in to comment.