Skip to content

Commit

Permalink
pr feedback and optimisations
Browse files Browse the repository at this point in the history
  • Loading branch information
intergalacticspacehighway committed Mar 30, 2024
1 parent dca54c1 commit d02bd1a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 101 deletions.
99 changes: 5 additions & 94 deletions packages/react-native/React/Views/RCTConvert+Transform.m
Original file line number Diff line number Diff line change
Expand Up @@ -48,100 +48,7 @@ + (CATransform3D)CATransform3DFromMatrix:(id)json

+ (CATransform3D)CATransform3D:(id)json
{
CATransform3D transform = CATransform3DIdentity;
if (!json) {
return transform;
}
if (![json isKindOfClass:[NSArray class]]) {
RCTLogConvertError(json, @"a CATransform3D. Did you pass something other than an array?");
return transform;
}
// legacy matrix support
if ([(NSArray *)json count] == kMatrixArrayLength && [json[0] isKindOfClass:[NSNumber class]]) {
RCTLogWarn(
@"[RCTConvert CATransform3D:] has deprecated a matrix as input. Pass an array of configs (which can contain a matrix key) instead.");
return [self CATransform3DFromMatrix:json];
}

CGFloat zeroScaleThreshold = FLT_EPSILON;

CATransform3D next;
for (NSDictionary *transformConfig in (NSArray<NSDictionary *> *)json) {
if (transformConfig.count != 1) {
RCTLogConvertError(json, @"a CATransform3D. You must specify exactly one property per transform object.");
return transform;
}
NSString *property = transformConfig.allKeys[0];
id value = transformConfig[property];

if ([property isEqualToString:@"matrix"]) {
next = [self CATransform3DFromMatrix:value];
transform = CATransform3DConcat(next, transform);

} else if ([property isEqualToString:@"perspective"]) {
next = CATransform3DIdentity;
next.m34 = -1 / [value floatValue];
transform = CATransform3DConcat(next, transform);

} else if ([property isEqualToString:@"rotateX"]) {
CGFloat rotate = [self convertToRadians:value];
transform = CATransform3DRotate(transform, rotate, 1, 0, 0);

} else if ([property isEqualToString:@"rotateY"]) {
CGFloat rotate = [self convertToRadians:value];
transform = CATransform3DRotate(transform, rotate, 0, 1, 0);

} else if ([property isEqualToString:@"rotate"] || [property isEqualToString:@"rotateZ"]) {
CGFloat rotate = [self convertToRadians:value];
transform = CATransform3DRotate(transform, rotate, 0, 0, 1);

} else if ([property isEqualToString:@"scale"]) {
CGFloat scale = [value floatValue];
scale = ABS(scale) < zeroScaleThreshold ? zeroScaleThreshold : scale;
transform = CATransform3DScale(transform, scale, scale, 1);

} else if ([property isEqualToString:@"scaleX"]) {
CGFloat scale = [value floatValue];
scale = ABS(scale) < zeroScaleThreshold ? zeroScaleThreshold : scale;
transform = CATransform3DScale(transform, scale, 1, 1);

} else if ([property isEqualToString:@"scaleY"]) {
CGFloat scale = [value floatValue];
scale = ABS(scale) < zeroScaleThreshold ? zeroScaleThreshold : scale;
transform = CATransform3DScale(transform, 1, scale, 1);

} else if ([property isEqualToString:@"translate"]) {
NSArray *array = (NSArray<NSNumber *> *)value;
CGFloat translateX = [array[0] floatValue];
CGFloat translateY = [array[1] floatValue];
CGFloat translateZ = array.count > 2 ? [array[2] floatValue] : 0;
transform = CATransform3DTranslate(transform, translateX, translateY, translateZ);

} else if ([property isEqualToString:@"translateX"]) {
CGFloat translate = [value floatValue];
transform = CATransform3DTranslate(transform, translate, 0, 0);

} else if ([property isEqualToString:@"translateY"]) {
CGFloat translate = [value floatValue];
transform = CATransform3DTranslate(transform, 0, translate, 0);

} else if ([property isEqualToString:@"skewX"]) {
CGFloat skew = [self convertToRadians:value];
next = CATransform3DIdentity;
next.m21 = tanf(skew);
transform = CATransform3DConcat(next, transform);

} else if ([property isEqualToString:@"skewY"]) {
CGFloat skew = [self convertToRadians:value];
next = CATransform3DIdentity;
next.m12 = tanf(skew);
transform = CATransform3DConcat(next, transform);

} else {
RCTLogInfo(@"Unsupported transform type for a CATransform3D: %@.", property);
}
}
return transform;
return [self CATransform3D:json withWidth:NAN height:NAN];
}

+ (CATransform3D)CATransform3D:(id)json withWidth:(CGFloat)width height:(CGFloat)height {
Expand Down Expand Up @@ -249,6 +156,10 @@ + (CGFloat)parseTranslate:(id)value withDimension:(CGFloat)dimension {
} else if ([value isKindOfClass:[NSString class]]) {
NSString *stringValue = (NSString *)value;
if ([stringValue hasSuffix:@"%"]) {
if (isnan(dimension)) {
RCTLogConvertError(value, @"a CATransform3D. Expected dimension to be available for percentage calculation.");
return 0;
}
NSString *percentageString = [stringValue substringToIndex:stringValue.length - 1];
CGFloat percentage = [percentageString floatValue] / 100.0f;
return dimension * percentage;
Expand Down
2 changes: 1 addition & 1 deletion packages/react-native/React/Views/UIView+React.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ typedef struct {
* The anchorPoint property doesn't work in the same way as on web - updating it updates the frame.
* To work around this, we take both the transform and the transform-origin, and compute it ourselves
*/
@property (nonatomic, copy) NSArray* reactTransform;
@property (nonatomic, retain) NSArray* reactTransform;
@property (nonatomic, assign) RCTTransformOrigin reactTransformOrigin;

/**
Expand Down
14 changes: 8 additions & 6 deletions packages/react-native/React/Views/UIView+React.m
Original file line number Diff line number Diff line change
Expand Up @@ -203,12 +203,14 @@ - (void)reactSetFrame:(CGRect)frame
}

self.center = position;
self.bounds = bounds;

id transformOrigin = objc_getAssociatedObject(self, @selector(reactTransformOrigin));
id transform = objc_getAssociatedObject(self, @selector(reactTransform));
if (transformOrigin || transform) {
updateTransform(self);

if (!CGRectEqualToRect(self.bounds, bounds)) {
self.bounds = bounds;
id transformOrigin = objc_getAssociatedObject(self, @selector(reactTransformOrigin));
id transform = objc_getAssociatedObject(self, @selector(reactTransform));
if (transform || transformOrigin) {
updateTransform(self);
}
}
}

Expand Down

0 comments on commit d02bd1a

Please sign in to comment.