Fix: Correct Layout Behavior for Combined align-content and align-items (#47732)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47732

This pull request addresses the issue where combining align-content and align-items properties resulted in incorrect layout behavior in Yoga version 3.1.0, as reported in [Issue https://github.com/facebook/yoga/issues/1739](https://github.com/facebook/yoga/issues/1739).

# Changes Made:

Alignment Logic Update: Modified the alignment calculations to ensure that the combination of align-content and align-items properties produces the expected layout, consistent with CSS Flexbox standards and previous Yoga versions.

Test Cases Added: Introduced new test cases to cover scenarios involving various combinations of align-content and align-items properties to prevent future regressions.

# Testing:

All existing tests pass successfully.

New test cases confirm that the layout behaves as expected when align-content and align-items are used together.

# Impact:

This fix ensures that layouts using both align-content and align-items properties render correctly, aligning with the behavior observed in Yoga version 1.19.0 and standard web browsers.

X-link: https://github.com/facebook/yoga/pull/1742

Reviewed By: joevilches

Differential Revision: D65953882

Pulled By: zeyap

fbshipit-source-id: 7e12a21b1d442b35c3f3536cad32dc4b82130d15
This commit is contained in:
phuccvx12 2024-11-20 19:59:42 -08:00 committed by Facebook GitHub Bot
parent 17502dd743
commit 73a2be1243

View File

@ -1751,6 +1751,7 @@ static void calculateLayoutImpl(
if (performLayout && (isNodeFlexWrap || isBaselineLayout(node))) { if (performLayout && (isNodeFlexWrap || isBaselineLayout(node))) {
float leadPerLine = 0; float leadPerLine = 0;
float currentLead = leadingPaddingAndBorderCross; float currentLead = leadingPaddingAndBorderCross;
float extraSpacePerLine = 0;
const float unclampedCrossDim = sizingModeCrossDim == SizingMode::StretchFit const float unclampedCrossDim = sizingModeCrossDim == SizingMode::StretchFit
? availableInnerCrossDim + paddingAndBorderAxisCross ? availableInnerCrossDim + paddingAndBorderAxisCross
@ -1786,7 +1787,8 @@ static void calculateLayoutImpl(
currentLead += remainingAlignContentDim / 2; currentLead += remainingAlignContentDim / 2;
break; break;
case Align::Stretch: case Align::Stretch:
leadPerLine = remainingAlignContentDim / static_cast<float>(lineCount); extraSpacePerLine =
remainingAlignContentDim / static_cast<float>(lineCount);
break; break;
case Align::SpaceAround: case Align::SpaceAround:
currentLead += currentLead +=
@ -1856,6 +1858,7 @@ static void calculateLayoutImpl(
} }
endIterator = iterator; endIterator = iterator;
currentLead += i != 0 ? crossAxisGap : 0; currentLead += i != 0 ? crossAxisGap : 0;
lineHeight += extraSpacePerLine;
for (iterator = startIterator; iterator != endIterator; iterator++) { for (iterator = startIterator; iterator != endIterator; iterator++) {
const auto child = *iterator; const auto child = *iterator;