[SliderIOS] Apply value after minimum/maximumValue in order to ensure 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 https://github.com/facebook/react-native/pull/835 Github Author: Brent Vatne <brent.vatne@madriska.com> Test Plan: Imported from GitHub, without a `Test Plan:` line.
This commit is contained in:
parent
173615ae26
commit
5fb5148e3d
|
@ -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
|
|
@ -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
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#import "RCTBridge.h"
|
||||
#import "RCTEventDispatcher.h"
|
||||
#import "RCTSlider.h"
|
||||
#import "UIView+React.h"
|
||||
|
||||
@implementation RCTSliderManager
|
||||
|
@ -19,32 +20,31 @@ RCT_EXPORT_MODULE()
|
|||
|
||||
- (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)sliderValueChanged:(UISlider *)sender
|
||||
{
|
||||
RCTSendSliderEvent(self, sender, YES);
|
||||
}
|
||||
|
||||
- (void)sliderTouchEnd:(UISlider *)sender
|
||||
{
|
||||
NSDictionary *event = @{
|
||||
@"target": sender.reactTag,
|
||||
@"value": @(sender.value),
|
||||
@"continuous": @NO,
|
||||
};
|
||||
|
||||
[self.bridge.eventDispatcher sendInputEventWithName:@"topChange" body:event];
|
||||
RCTSendSliderEvent(self, sender, NO);
|
||||
}
|
||||
|
||||
RCT_EXPORT_VIEW_PROPERTY(value, float);
|
||||
|
|
Loading…
Reference in New Issue