Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.

Commit 6736367

Browse files
nguyenhuyAdlai Holler
authored andcommitted
[ASStackLayoutSpec] Refactor baseline alignment algorithm (#2892)
* Add tests for baseline alignments * Merge baseline alignment algorithm to the main stack algorithm - Baseline alignment is now part of the main stack algorithm. - ASStackBaselinePositionedLayout is no longer needed and removed. * All snapshot test cases of ASStackLayoutSpec are passing now * Remove baselineRelativeArrangement * Remove TODO * Minor fixes in cross size determination step
1 parent 68bd326 commit 6736367

21 files changed

Lines changed: 300 additions & 369 deletions

AsyncDisplayKit.xcodeproj/project.pbxproj

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,6 @@
297297
9C70F20D1CDBE9CB007D6C76 /* ASDefaultPlayButton.h in Headers */ = {isa = PBXBuildFile; fileRef = AEB7B0181C5962EA00662EF4 /* ASDefaultPlayButton.h */; };
298298
9C70F20E1CDBE9E5007D6C76 /* NSArray+Diffing.h in Headers */ = {isa = PBXBuildFile; fileRef = DBC452D91C5BF64600B16017 /* NSArray+Diffing.h */; settings = {ATTRIBUTES = (Public, ); }; };
299299
9C70F20F1CDBE9FF007D6C76 /* ASLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B30BF6501C5964B0004FCD53 /* ASLayoutManager.h */; };
300-
9C8221961BA237B80037F19A /* ASStackBaselinePositionedLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */; };
301-
9C8221971BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */; };
302-
9C8221981BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */; };
303300
9C8898BB1C738B9800D6B02E /* ASTextKitFontSizeAdjuster.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C8898BA1C738B9800D6B02E /* ASTextKitFontSizeAdjuster.mm */; };
304301
9C8898BC1C738BA800D6B02E /* ASTextKitFontSizeAdjuster.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C8898BA1C738B9800D6B02E /* ASTextKitFontSizeAdjuster.mm */; };
305302
9C8898BD1C738BB800D6B02E /* ASTextKitFontSizeAdjuster.h in Headers */ = {isa = PBXBuildFile; fileRef = A32FEDD31C501B6A004F642A /* ASTextKitFontSizeAdjuster.h */; };
@@ -640,7 +637,6 @@
640637
F7CE6C991D2CDB5800BE4C15 /* ASLayoutSpecUtilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = ACF6ED451B17847A00DA7C62 /* ASLayoutSpecUtilities.h */; };
641638
F7CE6C9A1D2CDB5800BE4C15 /* ASMultidimensionalArrayUtils.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0442850B1BAA64EC00D16268 /* ASMultidimensionalArrayUtils.h */; };
642639
F7CE6C9B1D2CDB5800BE4C15 /* ASPendingStateController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CC3B20811C3F76D600798563 /* ASPendingStateController.h */; };
643-
F7CE6C9D1D2CDB5800BE4C15 /* ASStackBaselinePositionedLayout.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */; };
644640
F7CE6C9E1D2CDB5800BE4C15 /* ASStackLayoutSpecUtilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = ACF6ED461B17847A00DA7C62 /* ASStackLayoutSpecUtilities.h */; };
645641
F7CE6C9F1D2CDB5800BE4C15 /* ASStackPositionedLayout.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = ACF6ED471B17847A00DA7C62 /* ASStackPositionedLayout.h */; };
646642
F7CE6CA01D2CDB5800BE4C15 /* ASStackUnpositionedLayout.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = ACF6ED491B17847A00DA7C62 /* ASStackUnpositionedLayout.h */; };
@@ -818,7 +814,6 @@
818814
F7CE6C991D2CDB5800BE4C15 /* ASLayoutSpecUtilities.h in CopyFiles */,
819815
F7CE6C9A1D2CDB5800BE4C15 /* ASMultidimensionalArrayUtils.h in CopyFiles */,
820816
F7CE6C9B1D2CDB5800BE4C15 /* ASPendingStateController.h in CopyFiles */,
821-
F7CE6C9D1D2CDB5800BE4C15 /* ASStackBaselinePositionedLayout.h in CopyFiles */,
822817
F7CE6C9E1D2CDB5800BE4C15 /* ASStackLayoutSpecUtilities.h in CopyFiles */,
823818
F7CE6C9F1D2CDB5800BE4C15 /* ASStackPositionedLayout.h in CopyFiles */,
824819
F7CE6CA01D2CDB5800BE4C15 /* ASStackUnpositionedLayout.h in CopyFiles */,
@@ -1072,8 +1067,6 @@
10721067
9C6BB3B01B8CC9C200F13F52 /* ASAbsoluteLayoutElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASAbsoluteLayoutElement.h; path = AsyncDisplayKit/Layout/ASAbsoluteLayoutElement.h; sourceTree = "<group>"; };
10731068
9C70F2011CDA4EFA007D6C76 /* ASTraitCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASTraitCollection.h; sourceTree = "<group>"; };
10741069
9C70F2021CDA4EFA007D6C76 /* ASTraitCollection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASTraitCollection.m; sourceTree = "<group>"; };
1075-
9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASStackBaselinePositionedLayout.h; sourceTree = "<group>"; };
1076-
9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASStackBaselinePositionedLayout.mm; sourceTree = "<group>"; };
10771070
9C8898BA1C738B9800D6B02E /* ASTextKitFontSizeAdjuster.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASTextKitFontSizeAdjuster.mm; path = TextKit/ASTextKitFontSizeAdjuster.mm; sourceTree = "<group>"; };
10781071
9CDC18CB1B910E12004965E2 /* ASLayoutElementPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASLayoutElementPrivate.h; path = AsyncDisplayKit/Layout/ASLayoutElementPrivate.h; sourceTree = "<group>"; };
10791072
9CFFC6BD1CCAC52B006A6476 /* ASEnvironment.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASEnvironment.mm; sourceTree = "<group>"; };
@@ -1638,8 +1631,6 @@
16381631
0442850C1BAA64EC00D16268 /* ASMultidimensionalArrayUtils.mm */,
16391632
CC3B20811C3F76D600798563 /* ASPendingStateController.h */,
16401633
CC3B20821C3F76D600798563 /* ASPendingStateController.mm */,
1641-
9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */,
1642-
9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */,
16431634
ACF6ED461B17847A00DA7C62 /* ASStackLayoutSpecUtilities.h */,
16441635
ACF6ED471B17847A00DA7C62 /* ASStackPositionedLayout.h */,
16451636
ACF6ED481B17847A00DA7C62 /* ASStackPositionedLayout.mm */,
@@ -1962,7 +1953,6 @@
19621953
254C6B751BF94DF4003EC431 /* ASTextKitComponents.h in Headers */,
19631954
B35062081B010EFD0018CF92 /* ASScrollNode.h in Headers */,
19641955
25E327571C16819500A2170C /* ASPagerNode.h in Headers */,
1965-
9C8221961BA237B80037F19A /* ASStackBaselinePositionedLayout.h in Headers */,
19661956
9C70F20E1CDBE9E5007D6C76 /* NSArray+Diffing.h in Headers */,
19671957
9C49C3701B853961000B0DD5 /* ASStackLayoutElement.h in Headers */,
19681958
DE040EF91C2B40AC004692FF /* ASCollectionViewFlowLayoutInspector.h in Headers */,
@@ -2302,7 +2292,6 @@
23022292
9C8898BB1C738B9800D6B02E /* ASTextKitFontSizeAdjuster.mm in Sources */,
23032293
D785F6631A74327E00291744 /* ASScrollNode.mm in Sources */,
23042294
E5711A2E1C840C96009619D4 /* ASIndexedNodeContext.mm in Sources */,
2305-
9C8221971BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */,
23062295
251B8EF81BBB3D690087C538 /* ASCollectionDataController.mm in Sources */,
23072296
ACF6ED301B17843500DA7C62 /* ASStackLayoutSpec.mm in Sources */,
23082297
257754BE1BEE458E00737CA5 /* ASTextKitComponents.mm in Sources */,
@@ -2496,7 +2485,6 @@
24962485
254C6B851BF94F8A003EC431 /* ASTextKitAttributes.mm in Sources */,
24972486
509E68601B3AED8E009B9150 /* ASScrollDirection.m in Sources */,
24982487
B35062091B010EFD0018CF92 /* ASScrollNode.mm in Sources */,
2499-
9C8221981BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */,
25002488
8BDA5FC81CDBDF95007D13B2 /* ASVideoPlayerNode.mm in Sources */,
25012489
34EFC7721B701D0300AD841F /* ASStackLayoutSpec.mm in Sources */,
25022490
34EFC7761B701D2A00AD841F /* ASStackPositionedLayout.mm in Sources */,

AsyncDisplayKit/Layout/ASStackLayoutSpec.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ NS_ASSUME_NONNULL_BEGIN
5959
@property (nonatomic, assign) ASStackLayoutJustifyContent justifyContent;
6060
/** Orientation of children along cross axis. Defaults to ASStackLayoutAlignItemsStretch */
6161
@property (nonatomic, assign) ASStackLayoutAlignItems alignItems;
62-
/** If YES the vertical spacing between two views is measured from the last baseline of the top view to the top of the bottom view */
63-
@property (nonatomic, assign) BOOL baselineRelativeArrangement;
6462

6563
- (instancetype)init;
6664

AsyncDisplayKit/Layout/ASStackLayoutSpec.mm

Lines changed: 12 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
#import <numeric>
1212
#import <vector>
1313

14+
#import "ASStackLayoutSpec.h"
15+
#import "ASDimension.h"
1416
#import "ASInternalHelpers.h"
15-
17+
#import "ASLayout.h"
1618
#import "ASLayoutElement.h"
1719
#import "ASLayoutElementStylePrivate.h"
1820
#import "ASLayoutSpecUtilities.h"
19-
#import "ASStackBaselinePositionedLayout.h"
21+
#import "ASStackPositionedLayout.h"
22+
#import "ASStackUnpositionedLayout.h"
2023
#import "ASThread.h"
2124

2225
@implementation ASStackLayoutSpec
@@ -111,12 +114,6 @@ - (void)setSpacing:(CGFloat)spacing
111114
_spacing = spacing;
112115
}
113116

114-
- (void)setBaselineRelativeArrangement:(BOOL)baselineRelativeArrangement
115-
{
116-
ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable");
117-
_baselineRelativeArrangement = baselineRelativeArrangement;
118-
}
119-
120117
- (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize
121118
{
122119
NSArray *children = self.children;
@@ -131,53 +128,21 @@ - (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize
131128
return {child, style, style.size};
132129
});
133130

134-
const ASStackLayoutSpecStyle style = {.direction = _direction, .spacing = _spacing, .justifyContent = _justifyContent, .alignItems = _alignItems, .baselineRelativeArrangement = _baselineRelativeArrangement};
131+
const ASStackLayoutSpecStyle style = {.direction = _direction, .spacing = _spacing, .justifyContent = _justifyContent, .alignItems = _alignItems};
135132

136-
// First pass is to get the children into a positioned state
137133
const auto unpositionedLayout = ASStackUnpositionedLayout::compute(stackChildren, style, constrainedSize);
138134
const auto positionedLayout = ASStackPositionedLayout::compute(unpositionedLayout, style, constrainedSize);
139135

140-
// Figure out if a baseline pass is really needed
141-
const BOOL directionIsVertical = (style.direction == ASStackLayoutDirectionVertical);
142-
const BOOL needsBaselineAlignment = ASStackBaselinePositionedLayout::needsBaselineAlignment(style);
143-
const BOOL needsBaselinePositioning = (directionIsVertical == NO || needsBaselineAlignment == YES);
144-
145-
NSMutableArray *sublayouts = [NSMutableArray array];
146-
CGSize finalSize = CGSizeZero;
147-
if (needsBaselinePositioning) {
148-
// All horizontal stacks, regardless of whether or not they are baseline aligned, should go through a baseline
149-
// computation. They could be used in another horizontal stack that is baseline aligned and will need to have
150-
// computed the proper ascender/descender.
151-
152-
// Vertical stacks do not need to go through this computation since we can easily compute ascender/descender by
153-
// looking at their first/last child's ascender/descender.
154-
const auto baselinePositionedLayout = ASStackBaselinePositionedLayout::compute(positionedLayout, style, constrainedSize);
155-
156-
if (directionIsVertical == NO) {
157-
self.style.ascender = baselinePositionedLayout.ascender;
158-
self.style.descender = baselinePositionedLayout.descender;
159-
}
160-
161-
if (needsBaselineAlignment == YES) {
162-
finalSize = directionSize(style.direction, unpositionedLayout.stackDimensionSum, baselinePositionedLayout.crossSize);
163-
164-
for (const auto &l : baselinePositionedLayout.items) {
165-
[sublayouts addObject:l.layout];
166-
}
167-
}
168-
}
169-
170-
if (directionIsVertical == YES) {
136+
if (style.direction == ASStackLayoutDirectionVertical) {
171137
self.style.ascender = stackChildren.front().style.ascender;
172138
self.style.descender = stackChildren.back().style.descender;
173139
}
174140

175-
if (needsBaselineAlignment == NO) {
176-
finalSize = directionSize(style.direction, unpositionedLayout.stackDimensionSum, positionedLayout.crossSize);
177-
178-
for (const auto &l : positionedLayout.items) {
179-
[sublayouts addObject:l.layout];
180-
}
141+
const CGSize finalSize = directionSize(style.direction, unpositionedLayout.stackDimensionSum, unpositionedLayout.crossSize);
142+
143+
NSMutableArray *sublayouts = [NSMutableArray array];
144+
for (const auto &l : positionedLayout.items) {
145+
[sublayouts addObject:l.layout];
181146
}
182147

183148
return [ASLayout layoutWithLayoutElement:self size:ASSizeRangeClamp(constrainedSize, finalSize) sublayouts:sublayouts];

AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.h

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)