mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-24 04:16:00 +08:00
Drive any numerical prop via NativeAnimated
Summary: In theory, we should be able to animate any non-layout property, including custom ones. While there is still work to be done on the native side to fully enable this, we should start by dropping the prop whitelist. Closes https://github.com/facebook/react-native/pull/10658 Differential Revision: D4379031 Pulled By: ericvicenti fbshipit-source-id: fe9c30ea101e93a8b260d7d09a909fafbb82fee6
This commit is contained in:
committed by
Facebook Github Bot
parent
0bfb426877
commit
7e869b9d0a
@@ -14,11 +14,10 @@
|
||||
|
||||
@interface RCTPropsAnimatedNode : RCTAnimatedNode
|
||||
|
||||
@property (nonatomic, readonly) RCTViewPropertyMapper *propertyMapper;
|
||||
- (void)connectToView:(NSNumber *)viewTag
|
||||
viewName:(NSString *)viewName
|
||||
uiManager:(RCTUIManager *)uiManager;
|
||||
|
||||
- (void)connectToView:(NSNumber *)viewTag uiManager:(RCTUIManager *)uiManager;
|
||||
- (void)disconnectFromView:(NSNumber *)viewTag;
|
||||
|
||||
- (void)performViewUpdatesIfNecessary;
|
||||
|
||||
@end
|
||||
|
||||
@@ -9,27 +9,33 @@
|
||||
|
||||
#import "RCTPropsAnimatedNode.h"
|
||||
|
||||
#import <React/RCTLog.h>
|
||||
#import <React/RCTUIManager.h>
|
||||
|
||||
#import "RCTAnimationUtils.h"
|
||||
#import "RCTStyleAnimatedNode.h"
|
||||
#import "RCTValueAnimatedNode.h"
|
||||
#import "RCTViewPropertyMapper.h"
|
||||
|
||||
@implementation RCTPropsAnimatedNode
|
||||
@implementation RCTPropsAnimatedNode {
|
||||
NSNumber *_connectedViewTag;
|
||||
NSString *_connectedViewName;
|
||||
RCTUIManager *_uiManager;
|
||||
}
|
||||
|
||||
- (void)connectToView:(NSNumber *)viewTag uiManager:(RCTUIManager *)uiManager
|
||||
- (void)connectToView:(NSNumber *)viewTag
|
||||
viewName:(NSString *)viewName
|
||||
uiManager:(RCTUIManager *)uiManager
|
||||
{
|
||||
_propertyMapper = [[RCTViewPropertyMapper alloc] initWithViewTag:viewTag uiManager:uiManager];
|
||||
_connectedViewTag = viewTag;
|
||||
_connectedViewName = viewName;
|
||||
_uiManager = uiManager;
|
||||
}
|
||||
|
||||
- (void)disconnectFromView:(NSNumber *)viewTag
|
||||
{
|
||||
_propertyMapper = nil;
|
||||
}
|
||||
|
||||
- (void)performUpdate
|
||||
{
|
||||
[super performUpdate];
|
||||
[self performViewUpdatesIfNecessary];
|
||||
_connectedViewTag = nil;
|
||||
_connectedViewName = nil;
|
||||
_uiManager = nil;
|
||||
}
|
||||
|
||||
- (NSString *)propertyNameForParentTag:(NSNumber *)parentTag
|
||||
@@ -44,8 +50,15 @@
|
||||
return propertyName;
|
||||
}
|
||||
|
||||
- (void)performViewUpdatesIfNecessary
|
||||
- (void)performUpdate
|
||||
{
|
||||
[super performUpdate];
|
||||
|
||||
if (!_connectedViewTag) {
|
||||
RCTLogError(@"Node has not been attached to a view");
|
||||
return;
|
||||
}
|
||||
|
||||
NSMutableDictionary *props = [NSMutableDictionary dictionary];
|
||||
[self.parentNodes enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull parentTag, RCTAnimatedNode * _Nonnull parentNode, BOOL * _Nonnull stop) {
|
||||
|
||||
@@ -61,7 +74,9 @@
|
||||
}];
|
||||
|
||||
if (props.count) {
|
||||
[_propertyMapper updateViewWithDictionary:props];
|
||||
[_uiManager synchronouslyUpdateViewOnUIThread:_connectedViewTag
|
||||
viewName:_connectedViewName
|
||||
props:props];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,14 +33,12 @@
|
||||
{
|
||||
[super performUpdate];
|
||||
|
||||
CATransform3D transform = CATransform3DIdentity;
|
||||
|
||||
NSArray<NSDictionary *> *transformConfigs = self.config[@"transforms"];
|
||||
NSMutableArray<NSDictionary *> *transform = [NSMutableArray arrayWithCapacity:transformConfigs.count];
|
||||
for (NSDictionary *transformConfig in transformConfigs) {
|
||||
NSString *type = transformConfig[@"type"];
|
||||
NSString *property = transformConfig[@"property"];
|
||||
|
||||
CGFloat value;
|
||||
NSNumber *value;
|
||||
if ([type isEqualToString: @"animated"]) {
|
||||
NSNumber *nodeTag = transformConfig[@"nodeTag"];
|
||||
RCTAnimatedNode *node = self.parentNodes[nodeTag];
|
||||
@@ -48,41 +46,14 @@
|
||||
continue;
|
||||
}
|
||||
RCTValueAnimatedNode *parentNode = (RCTValueAnimatedNode *)node;
|
||||
value = parentNode.value;
|
||||
value = @(parentNode.value);
|
||||
} else {
|
||||
value = [transformConfig[@"value"] floatValue];
|
||||
}
|
||||
|
||||
if ([property isEqualToString:@"scale"]) {
|
||||
transform = CATransform3DScale(transform, value, value, 1);
|
||||
|
||||
} else if ([property isEqualToString:@"scaleX"]) {
|
||||
transform = CATransform3DScale(transform, value, 1, 1);
|
||||
|
||||
} else if ([property isEqualToString:@"scaleY"]) {
|
||||
transform = CATransform3DScale(transform, 1, value, 1);
|
||||
|
||||
} else if ([property isEqualToString:@"translateX"]) {
|
||||
transform = CATransform3DTranslate(transform, value, 0, 0);
|
||||
|
||||
} else if ([property isEqualToString:@"translateY"]) {
|
||||
transform = CATransform3DTranslate(transform, 0, value, 0);
|
||||
|
||||
} else if ([property isEqualToString:@"rotate"]) {
|
||||
transform = CATransform3DRotate(transform, value, 0, 0, 1);
|
||||
|
||||
} else if ([property isEqualToString:@"rotateX"]) {
|
||||
transform = CATransform3DRotate(transform, value, 1, 0, 0);
|
||||
|
||||
} else if ([property isEqualToString:@"rotateY"]) {
|
||||
transform = CATransform3DRotate(transform, value, 0, 1, 0);
|
||||
|
||||
} else if ([property isEqualToString:@"perspective"]) {
|
||||
transform.m34 = 1.0 / -value;
|
||||
value = transformConfig[@"value"];
|
||||
}
|
||||
[transform addObject:@{property: value}];
|
||||
}
|
||||
|
||||
_propsDictionary[@"transform"] = [NSValue valueWithCATransform3D:transform];
|
||||
_propsDictionary[@"transform"] = transform;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user