mirror of
https://github.com/status-im/react-native.git
synced 2025-01-15 12:05:06 +00:00
53c1da0047
Summary: The `NativeAnimationsExample` in Android can not work due to inputRange and outputRange were limited to double array type, which is different from iOS. So we need let android version to support string array type. Closes https://github.com/facebook/react-native/pull/8900 Differential Revision: D3674754 fbshipit-source-id: e7844f00940bf0fdd6f7f5003dd4eeefa0c317a0
89 lines
2.5 KiB
Objective-C
89 lines
2.5 KiB
Objective-C
/**
|
|
* 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 "RCTInterpolationAnimatedNode.h"
|
|
#import "RCTAnimationUtils.h"
|
|
|
|
@implementation RCTInterpolationAnimatedNode
|
|
{
|
|
__weak RCTValueAnimatedNode *_parentNode;
|
|
NSArray<NSNumber *> *_inputRange;
|
|
NSArray<NSNumber *> *_outputRange;
|
|
}
|
|
|
|
- (instancetype)initWithTag:(NSNumber *)tag
|
|
config:(NSDictionary<NSString *, id> *)config
|
|
{
|
|
if ((self = [super initWithTag:tag config:config])) {
|
|
_inputRange = [config[@"inputRange"] copy];
|
|
NSMutableArray *outputRange = [NSMutableArray array];
|
|
for (id value in config[@"outputRange"]) {
|
|
if ([value isKindOfClass:[NSNumber class]]) {
|
|
[outputRange addObject:value];
|
|
}
|
|
}
|
|
_outputRange = [outputRange copy];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)onAttachedToNode:(RCTAnimatedNode *)parent
|
|
{
|
|
[super onAttachedToNode:parent];
|
|
if ([parent isKindOfClass:[RCTValueAnimatedNode class]]) {
|
|
_parentNode = (RCTValueAnimatedNode *)parent;
|
|
}
|
|
}
|
|
|
|
- (void)onDetachedFromNode:(RCTAnimatedNode *)parent
|
|
{
|
|
[super onDetachedFromNode:parent];
|
|
if (_parentNode == parent) {
|
|
_parentNode = nil;
|
|
}
|
|
}
|
|
|
|
- (NSUInteger)findIndexOfNearestValue:(CGFloat)value
|
|
inRange:(NSArray<NSNumber *> *)range
|
|
{
|
|
NSUInteger index;
|
|
NSUInteger rangeCount = range.count;
|
|
for (index = 1; index < rangeCount - 1; index++) {
|
|
NSNumber *inputValue = range[index];
|
|
if (inputValue.doubleValue >= value) {
|
|
break;
|
|
}
|
|
}
|
|
return index - 1;
|
|
}
|
|
|
|
- (void)performUpdate
|
|
{
|
|
[super performUpdate];
|
|
if (!_parentNode) {
|
|
return;
|
|
}
|
|
|
|
NSUInteger rangeIndex = [self findIndexOfNearestValue:_parentNode.value
|
|
inRange:_inputRange];
|
|
NSNumber *inputMin = _inputRange[rangeIndex];
|
|
NSNumber *inputMax = _inputRange[rangeIndex + 1];
|
|
NSNumber *outputMin = _outputRange[rangeIndex];
|
|
NSNumber *outputMax = _outputRange[rangeIndex + 1];
|
|
|
|
CGFloat outputValue = RCTInterpolateValue(_parentNode.value,
|
|
inputMin.doubleValue,
|
|
inputMax.doubleValue,
|
|
outputMin.doubleValue,
|
|
outputMax.doubleValue);
|
|
self.value = outputValue;
|
|
}
|
|
|
|
@end
|