Skip to content

Commit

Permalink
Use trait collection to resolve border colors (#32492)
Browse files Browse the repository at this point in the history
Summary:
c974cbf changed the border colors to be of UIColor instead of CGColor. This allowed working with dark mode to switch the border colors automatically. However, in certain situation the system can't resolve the current trait collection (see https://stackoverflow.com/a/57177411/2525941). This commit resolves the colors with the current trait collection to ensure the right colors are selected. This matches with the behavior of how the background color is resolved (also in displayLayer:).

## Changelog

[iOS] [Fixed] - Resolve border platform color based on current trait collection

Pull Request resolved: #32492

Test Plan: Same test plan as #29728

Reviewed By: sammy-SC

Differential Revision: D33819225

Pulled By: cortinico

fbshipit-source-id: 2f8024be7ee7b32d1852373b47fa1437cc569391
  • Loading branch information
danilobuerger authored and facebook-github-bot committed Feb 7, 2022
1 parent 731429e commit 9a35818
Showing 1 changed file with 29 additions and 17 deletions.
46 changes: 29 additions & 17 deletions React/Views/RCTView.m
Original file line number Diff line number Diff line change
Expand Up @@ -706,33 +706,45 @@ - (RCTCornerRadii)cornerRadii
};
}

- (RCTBorderColors)borderColors
- (RCTBorderColors)borderColorsWithTraitCollection:(UITraitCollection *)traitCollection
{
const BOOL isRTL = _reactLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft;

UIColor *directionAwareBorderLeftColor = nil;
UIColor *directionAwareBorderRightColor = nil;

if ([[RCTI18nUtil sharedInstance] doLeftAndRightSwapInRTL]) {
UIColor *borderStartColor = _borderStartColor ?: _borderLeftColor;
UIColor *borderEndColor = _borderEndColor ?: _borderRightColor;

UIColor *directionAwareBorderLeftColor = isRTL ? borderEndColor : borderStartColor;
UIColor *directionAwareBorderRightColor = isRTL ? borderStartColor : borderEndColor;

return (RCTBorderColors){
(_borderTopColor ?: _borderColor).CGColor,
(directionAwareBorderLeftColor ?: _borderColor).CGColor,
(_borderBottomColor ?: _borderColor).CGColor,
(directionAwareBorderRightColor ?: _borderColor).CGColor,
};
directionAwareBorderLeftColor = isRTL ? borderEndColor : borderStartColor;
directionAwareBorderRightColor = isRTL ? borderStartColor : borderEndColor;
} else {
directionAwareBorderLeftColor = (isRTL ? _borderEndColor : _borderStartColor) ?: _borderLeftColor;
directionAwareBorderRightColor = (isRTL ? _borderStartColor : _borderEndColor) ?: _borderRightColor;
}

UIColor *directionAwareBorderLeftColor = isRTL ? _borderEndColor : _borderStartColor;
UIColor *directionAwareBorderRightColor = isRTL ? _borderStartColor : _borderEndColor;
UIColor *borderColor = _borderColor;
UIColor *borderTopColor = _borderTopColor;
UIColor *borderBottomColor = _borderBottomColor;

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if (@available(iOS 13.0, *)) {
borderColor = [borderColor resolvedColorWithTraitCollection:self.traitCollection];
borderTopColor = [borderTopColor resolvedColorWithTraitCollection:self.traitCollection];
directionAwareBorderLeftColor =
[directionAwareBorderLeftColor resolvedColorWithTraitCollection:self.traitCollection];
borderBottomColor = [borderBottomColor resolvedColorWithTraitCollection:self.traitCollection];
directionAwareBorderRightColor =
[directionAwareBorderRightColor resolvedColorWithTraitCollection:self.traitCollection];
}
#endif

return (RCTBorderColors){
(_borderTopColor ?: _borderColor).CGColor,
(directionAwareBorderLeftColor ?: _borderLeftColor ?: _borderColor).CGColor,
(_borderBottomColor ?: _borderColor).CGColor,
(directionAwareBorderRightColor ?: _borderRightColor ?: _borderColor).CGColor,
(borderTopColor ?: borderColor).CGColor,
(directionAwareBorderLeftColor ?: borderColor).CGColor,
(borderBottomColor ?: borderColor).CGColor,
(directionAwareBorderRightColor ?: borderColor).CGColor,
};
}

Expand All @@ -758,7 +770,7 @@ - (void)displayLayer:(CALayer *)layer

const RCTCornerRadii cornerRadii = [self cornerRadii];
const UIEdgeInsets borderInsets = [self bordersAsInsets];
const RCTBorderColors borderColors = [self borderColors];
const RCTBorderColors borderColors = [self borderColorsWithTraitCollection:self.traitCollection];

BOOL useIOSBorderRendering = RCTCornerRadiiAreEqual(cornerRadii) && RCTBorderInsetsAreEqual(borderInsets) &&
RCTBorderColorsAreEqual(borderColors) && _borderStyle == RCTBorderStyleSolid &&
Expand Down

0 comments on commit 9a35818

Please sign in to comment.