mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
c7aa6dc827
Summary: When sliders are adjusted via accessibility, no onSlidingComplete callback is generated. This causes problems for components which perform behavior in this callback, and means that such components don't behave properly when adjusted via accessibility. For example, if an app hosting a volume control slider only commits the volume change to the hardware on onSlidingComplete, it is impossible for a screen reader user to ever actually adjust the volume. Ensure that sliders call the onSlidingComplete callback after adjusted via accessibility. ## Changelog [General] [Fix] - Add onSlidingComplete callbacks when sliders adjusted via a11y. [CATEGORY] [TYPE] - Message Pull Request resolved: https://github.com/facebook/react-native/pull/26600 Test Plan: Prior to this change, using the RNTester slider example with a screen reader, the onSlidingComplete callback tests never shows any callbacks when the slider is adjusted. With this change applied, the callback test will show a number of callbacks corresponding to the number of times the slider was adjusted via the screen reader. Differential Revision: D17661157 Pulled By: cpojer fbshipit-source-id: a6eedef099c6c1b571b290c329059ac9b69b53dd
108 lines
2.6 KiB
Objective-C
108 lines
2.6 KiB
Objective-C
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#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;
|
|
}
|
|
|
|
- (void)setTrackImage:(UIImage *)trackImage
|
|
{
|
|
if (trackImage != _trackImage) {
|
|
_trackImage = trackImage;
|
|
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];
|
|
}
|
|
|
|
- (UIImage *)thumbImage
|
|
{
|
|
return [self thumbImageForState:UIControlStateNormal];
|
|
}
|
|
|
|
- (void)accessibilityIncrement
|
|
{
|
|
[super accessibilityIncrement];
|
|
if (_onSlidingComplete) {
|
|
_onSlidingComplete(@{
|
|
@"value": @(self.value),
|
|
});
|
|
}
|
|
}
|
|
|
|
- (void)accessibilityDecrement
|
|
{
|
|
[super accessibilityDecrement];
|
|
if (_onSlidingComplete) {
|
|
_onSlidingComplete(@{
|
|
@"value": @(self.value),
|
|
});
|
|
}
|
|
}
|
|
|
|
@end
|