From 4bb84721825bb17632a481b221d9facf14d60bcf Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Thu, 10 Sep 2015 17:29:39 -0700 Subject: [PATCH] Removed ASBaselineLayoutSpec and made baseline alignment part of ASStackView --- AsyncDisplayKit.xcodeproj/project.pbxproj | 42 +++------- AsyncDisplayKit/Layout/ASBaselineLayoutSpec.h | 60 -------------- .../Layout/ASBaselineLayoutSpec.mm | 80 ------------------- AsyncDisplayKit/Layout/ASBaselineLayoutable.h | 23 ------ AsyncDisplayKit/Layout/ASLayoutOptions.h | 6 +- AsyncDisplayKit/Layout/ASLayoutable.h | 3 +- AsyncDisplayKit/Layout/ASStackLayoutDefines.h | 10 ++- AsyncDisplayKit/Layout/ASStackLayoutSpec.h | 2 + AsyncDisplayKit/Layout/ASStackLayoutSpec.mm | 33 +++++++- AsyncDisplayKit/Layout/ASStackLayoutable.h | 10 +++ ...ut.h => ASStackBaselinePositionedLayout.h} | 17 +--- ....mm => ASStackBaselinePositionedLayout.mm} | 51 ++++++------ .../Private/ASStackLayoutSpecUtilities.h | 5 ++ .../Private/ASStackPositionedLayout.mm | 2 + 14 files changed, 101 insertions(+), 243 deletions(-) delete mode 100644 AsyncDisplayKit/Layout/ASBaselineLayoutSpec.h delete mode 100644 AsyncDisplayKit/Layout/ASBaselineLayoutSpec.mm delete mode 100644 AsyncDisplayKit/Layout/ASBaselineLayoutable.h rename AsyncDisplayKit/Private/{ASBaselinePositionedLayout.h => ASStackBaselinePositionedLayout.h} (52%) rename AsyncDisplayKit/Private/{ASBaselinePositionedLayout.mm => ASStackBaselinePositionedLayout.mm} (82%) diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index e2e2e1e87e..22f2808c07 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -221,16 +221,6 @@ 509E68651B3AEDC5009B9150 /* CGRect+ASConvenience.h in Headers */ = {isa = PBXBuildFile; fileRef = 205F0E1F1B376416007741D0 /* CGRect+ASConvenience.h */; }; 509E68661B3AEDD7009B9150 /* CGRect+ASConvenience.m in Sources */ = {isa = PBXBuildFile; fileRef = 205F0E201B376416007741D0 /* CGRect+ASConvenience.m */; }; 6BDC61F61979037800E50D21 /* AsyncDisplayKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C204A641B86349B00313849 /* ASBaselinePositionedLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C204A621B86349B00313849 /* ASBaselinePositionedLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C204A651B86349B00313849 /* ASBaselinePositionedLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C204A621B86349B00313849 /* ASBaselinePositionedLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C204A661B86349B00313849 /* ASBaselinePositionedLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C204A631B86349B00313849 /* ASBaselinePositionedLayout.mm */; }; - 9C204A671B86349B00313849 /* ASBaselinePositionedLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C204A631B86349B00313849 /* ASBaselinePositionedLayout.mm */; }; - 9C204A6A1B87803A00313849 /* ASBaselineLayoutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C204A681B87803A00313849 /* ASBaselineLayoutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C204A6B1B87803A00313849 /* ASBaselineLayoutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C204A681B87803A00313849 /* ASBaselineLayoutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C3061061B857EC400D0530B /* ASBaselineLayoutSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C3061041B857EC400D0530B /* ASBaselineLayoutSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C3061071B857EC400D0530B /* ASBaselineLayoutSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C3061041B857EC400D0530B /* ASBaselineLayoutSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C3061081B857EC400D0530B /* ASBaselineLayoutSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C3061051B857EC400D0530B /* ASBaselineLayoutSpec.mm */; }; - 9C3061091B857EC400D0530B /* ASBaselineLayoutSpec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C3061051B857EC400D0530B /* ASBaselineLayoutSpec.mm */; }; 9C49C36F1B853957000B0DD5 /* ASStackLayoutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C49C36E1B853957000B0DD5 /* ASStackLayoutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9C49C3701B853961000B0DD5 /* ASStackLayoutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C49C36E1B853957000B0DD5 /* ASStackLayoutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9C5FA3511B8F6ADF00A62714 /* ASLayoutOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C5FA34F1B8F6ADF00A62714 /* ASLayoutOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -243,6 +233,10 @@ 9C5FA3601B90C9A500A62714 /* ASLayoutOptionsPrivate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C5FA35C1B90C9A500A62714 /* ASLayoutOptionsPrivate.mm */; }; 9C6BB3B21B8CC9C200F13F52 /* ASStaticLayoutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6BB3B01B8CC9C200F13F52 /* ASStaticLayoutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9C6BB3B31B8CC9C200F13F52 /* ASStaticLayoutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6BB3B01B8CC9C200F13F52 /* ASStaticLayoutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9C8221951BA237B80037F19A /* ASStackBaselinePositionedLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */; settings = {ASSET_TAGS = (); }; }; + 9C8221961BA237B80037F19A /* ASStackBaselinePositionedLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */; settings = {ASSET_TAGS = (); }; }; + 9C8221971BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */; settings = {ASSET_TAGS = (); }; }; + 9C8221981BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */; settings = {ASSET_TAGS = (); }; }; 9CDC18CC1B910E12004965E2 /* ASLayoutablePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CDC18CB1B910E12004965E2 /* ASLayoutablePrivate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9CDC18CD1B910E12004965E2 /* ASLayoutablePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CDC18CB1B910E12004965E2 /* ASLayoutablePrivate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9F06E5CD1B4CAF4200F015D8 /* ASCollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F06E5CC1B4CAF4200F015D8 /* ASCollectionViewTests.m */; }; @@ -586,17 +580,14 @@ 4640521E1A3F83C40061C0BA /* ASMultidimensionalArrayUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASMultidimensionalArrayUtils.h; sourceTree = ""; }; 4640521F1A3F83C40061C0BA /* ASMultidimensionalArrayUtils.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASMultidimensionalArrayUtils.mm; sourceTree = ""; }; 6BDC61F51978FEA400E50D21 /* AsyncDisplayKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AsyncDisplayKit.h; sourceTree = ""; }; - 9C204A621B86349B00313849 /* ASBaselinePositionedLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASBaselinePositionedLayout.h; sourceTree = ""; }; - 9C204A631B86349B00313849 /* ASBaselinePositionedLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASBaselinePositionedLayout.mm; sourceTree = ""; }; - 9C204A681B87803A00313849 /* ASBaselineLayoutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASBaselineLayoutable.h; path = AsyncDisplayKit/Layout/ASBaselineLayoutable.h; sourceTree = ""; }; - 9C3061041B857EC400D0530B /* ASBaselineLayoutSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASBaselineLayoutSpec.h; path = AsyncDisplayKit/Layout/ASBaselineLayoutSpec.h; sourceTree = ""; }; - 9C3061051B857EC400D0530B /* ASBaselineLayoutSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASBaselineLayoutSpec.mm; path = AsyncDisplayKit/Layout/ASBaselineLayoutSpec.mm; sourceTree = ""; }; 9C49C36E1B853957000B0DD5 /* ASStackLayoutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASStackLayoutable.h; path = AsyncDisplayKit/Layout/ASStackLayoutable.h; sourceTree = ""; }; 9C5FA34F1B8F6ADF00A62714 /* ASLayoutOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASLayoutOptions.h; path = AsyncDisplayKit/Layout/ASLayoutOptions.h; sourceTree = ""; }; 9C5FA3501B8F6ADF00A62714 /* ASLayoutOptions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASLayoutOptions.mm; path = AsyncDisplayKit/Layout/ASLayoutOptions.mm; sourceTree = ""; }; 9C5FA35B1B90C9A500A62714 /* ASLayoutOptionsPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASLayoutOptionsPrivate.h; path = AsyncDisplayKit/Layout/ASLayoutOptionsPrivate.h; sourceTree = ""; }; 9C5FA35C1B90C9A500A62714 /* ASLayoutOptionsPrivate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASLayoutOptionsPrivate.mm; path = AsyncDisplayKit/Layout/ASLayoutOptionsPrivate.mm; sourceTree = ""; }; 9C6BB3B01B8CC9C200F13F52 /* ASStaticLayoutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASStaticLayoutable.h; path = AsyncDisplayKit/Layout/ASStaticLayoutable.h; sourceTree = ""; }; + 9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASStackBaselinePositionedLayout.h; sourceTree = ""; }; + 9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASStackBaselinePositionedLayout.mm; sourceTree = ""; }; 9CDC18CB1B910E12004965E2 /* ASLayoutablePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASLayoutablePrivate.h; path = AsyncDisplayKit/Layout/ASLayoutablePrivate.h; sourceTree = ""; }; 9F06E5CC1B4CAF4200F015D8 /* ASCollectionViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASCollectionViewTests.m; sourceTree = ""; }; AC21EC0F1B3D0BF600C8B19A /* ASStackLayoutDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ASStackLayoutDefines.h; path = AsyncDisplayKit/Layout/ASStackLayoutDefines.h; sourceTree = ""; }; @@ -939,6 +930,8 @@ 058D0A01195D050800B7D73C /* Private */ = { isa = PBXGroup; children = ( + 9C8221931BA237B80037F19A /* ASStackBaselinePositionedLayout.h */, + 9C8221941BA237B80037F19A /* ASStackBaselinePositionedLayout.mm */, 296A0A2C1A9516B2005ACEAA /* ASBatchFetching.h */, 2967F9E11AB0A4CF0072E4AB /* ASBasicImageDownloaderInternal.h */, 296A0A2D1A9516B2005ACEAA /* ASBatchFetching.m */, @@ -965,8 +958,6 @@ ACF6ED481B17847A00DA7C62 /* ASStackPositionedLayout.mm */, ACF6ED491B17847A00DA7C62 /* ASStackUnpositionedLayout.h */, ACF6ED4A1B17847A00DA7C62 /* ASStackUnpositionedLayout.mm */, - 9C204A621B86349B00313849 /* ASBaselinePositionedLayout.h */, - 9C204A631B86349B00313849 /* ASBaselinePositionedLayout.mm */, ); path = Private; sourceTree = ""; @@ -989,7 +980,6 @@ children = ( ACF6ED011B17843500DA7C62 /* ASBackgroundLayoutSpec.h */, ACF6ED021B17843500DA7C62 /* ASBackgroundLayoutSpec.mm */, - 9C204A681B87803A00313849 /* ASBaselineLayoutable.h */, ACF6ED031B17843500DA7C62 /* ASCenterLayoutSpec.h */, ACF6ED041B17843500DA7C62 /* ASCenterLayoutSpec.mm */, ACF6ED071B17843500DA7C62 /* ASDimension.h */, @@ -1015,8 +1005,6 @@ 9C6BB3B01B8CC9C200F13F52 /* ASStaticLayoutable.h */, ACF6ED181B17843500DA7C62 /* ASStaticLayoutSpec.h */, ACF6ED191B17843500DA7C62 /* ASStaticLayoutSpec.mm */, - 9C3061041B857EC400D0530B /* ASBaselineLayoutSpec.h */, - 9C3061051B857EC400D0530B /* ASBaselineLayoutSpec.mm */, 9C5FA34F1B8F6ADF00A62714 /* ASLayoutOptions.h */, 9C5FA3501B8F6ADF00A62714 /* ASLayoutOptions.mm */, 9C5FA35B1B90C9A500A62714 /* ASLayoutOptionsPrivate.h */, @@ -1081,8 +1069,8 @@ 464052241A3F83C40061C0BA /* ASLayoutController.h in Headers */, 464052201A3F83C40061C0BA /* ASDataController.h in Headers */, 05A6D05A19D0EB64002DD95E /* ASDealloc2MainObject.h in Headers */, + 9C8221951BA237B80037F19A /* ASStackBaselinePositionedLayout.h in Headers */, 0516FA401A1563D200B4EBED /* ASMultiplexImageNode.h in Headers */, - 9C204A6A1B87803A00313849 /* ASBaselineLayoutable.h in Headers */, 058D0A47195D05CB00B7D73C /* ASControlNode.h in Headers */, 058D0A48195D05CB00B7D73C /* ASControlNode.m in Headers */, 058D0A49195D05CB00B7D73C /* ASControlNode+Subclasses.h in Headers */, @@ -1106,7 +1094,6 @@ 0574D5E219C110940097DC25 /* ASTableViewProtocols.h in Headers */, 055F1A3C19ABD43F004DAFF1 /* ASCellNode.h in Headers */, 058D0A53195D05DC00B7D73C /* _ASDisplayLayer.h in Headers */, - 9C204A641B86349B00313849 /* ASBaselinePositionedLayout.h in Headers */, 058D0A54195D05DC00B7D73C /* _ASDisplayLayer.mm in Headers */, 058D0A55195D05DC00B7D73C /* _ASDisplayView.h in Headers */, 058D0A56195D05DC00B7D73C /* _ASDisplayView.mm in Headers */, @@ -1133,7 +1120,6 @@ 058D0A67195D05DC00B7D73C /* NSMutableAttributedString+TextKitAdditions.m in Headers */, 058D0A68195D05EC00B7D73C /* _ASAsyncTransaction.h in Headers */, 205F0E0F1B371875007741D0 /* UICollectionViewLayout+ASConvenience.h in Headers */, - 9C3061061B857EC400D0530B /* ASBaselineLayoutSpec.h in Headers */, 058D0A69195D05EC00B7D73C /* _ASAsyncTransaction.m in Headers */, 058D0A6A195D05EC00B7D73C /* _ASAsyncTransactionContainer+Private.h in Headers */, 058D0A6B195D05EC00B7D73C /* _ASAsyncTransactionContainer.h in Headers */, @@ -1203,7 +1189,6 @@ B35061FA1B010EFD0018CF92 /* ASControlNode+Subclasses.h in Headers */, B35062371B010EFD0018CF92 /* ASTextNodeWordKerner.h in Headers */, B35062261B010EFD0018CF92 /* ASRangeController.h in Headers */, - 9C204A651B86349B00313849 /* ASBaselinePositionedLayout.h in Headers */, B35062111B010EFD0018CF92 /* _ASDisplayView.h in Headers */, B35061F81B010EFD0018CF92 /* ASControlNode.h in Headers */, 430E7C901B4C23F100697A4C /* ASIndexPath.h in Headers */, @@ -1214,7 +1199,6 @@ B35061F31B010EFD0018CF92 /* ASCellNode.h in Headers */, 34EFC76C1B701CED00AD841F /* ASOverlayLayoutSpec.h in Headers */, B35062201B010EFD0018CF92 /* ASLayoutController.h in Headers */, - 9C3061071B857EC400D0530B /* ASBaselineLayoutSpec.h in Headers */, B35062571B010F070018CF92 /* ASAssert.h in Headers */, B35062411B010EFD0018CF92 /* _ASAsyncTransactionGroup.h in Headers */, B350623C1B010EFD0018CF92 /* _ASAsyncTransaction.h in Headers */, @@ -1259,7 +1243,6 @@ 34EFC7631B701CBF00AD841F /* ASCenterLayoutSpec.h in Headers */, B350624D1B010EFD0018CF92 /* _ASScopeTimer.h in Headers */, 34EFC7701B701CFA00AD841F /* ASStackLayoutDefines.h in Headers */, - 9C204A6B1B87803A00313849 /* ASBaselineLayoutable.h in Headers */, 509E68651B3AEDC5009B9150 /* CGRect+ASConvenience.h in Headers */, B350624F1B010EFD0018CF92 /* ASDisplayNode+DebugTiming.h in Headers */, B35062211B010EFD0018CF92 /* ASLayoutRangeType.h in Headers */, @@ -1279,6 +1262,7 @@ B35062001B010EFD0018CF92 /* ASEditableTextNode.h in Headers */, B350623A1B010EFD0018CF92 /* NSMutableAttributedString+TextKitAdditions.h in Headers */, B350623E1B010EFD0018CF92 /* _ASAsyncTransactionContainer+Private.h in Headers */, + 9C8221961BA237B80037F19A /* ASStackBaselinePositionedLayout.h in Headers */, B35062591B010F070018CF92 /* ASBaseDefines.h in Headers */, B35062191B010EFD0018CF92 /* ASDealloc2MainObject.h in Headers */, B350620F1B010EFD0018CF92 /* _ASDisplayLayer.h in Headers */, @@ -1483,7 +1467,6 @@ 058D0A26195D050800B7D73C /* _ASCoreAnimationExtras.mm in Sources */, 058D0A23195D050800B7D73C /* _ASAsyncTransactionContainer.m in Sources */, 058D0A1E195D050800B7D73C /* ASTextNodeShadower.m in Sources */, - 9C204A661B86349B00313849 /* ASBaselinePositionedLayout.mm in Sources */, ACF6ED2E1B17843500DA7C62 /* ASRatioLayoutSpec.mm in Sources */, 058D0A18195D050800B7D73C /* _ASDisplayLayer.mm in Sources */, ACF6ED321B17843500DA7C62 /* ASStaticLayoutSpec.mm in Sources */, @@ -1503,6 +1486,7 @@ 205F0E121B371BD7007741D0 /* ASScrollDirection.m in Sources */, AC47D9461B3BB41900AAEE9D /* ASRelativeSize.mm in Sources */, ACF6ED271B17843500DA7C62 /* ASLayoutSpec.mm in Sources */, + 9C8221971BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */, ACF6ED211B17843500DA7C62 /* ASDimension.mm in Sources */, 464052261A3F83C40061C0BA /* ASMultidimensionalArrayUtils.mm in Sources */, 055B9FA91A1C154B00035D6D /* ASNetworkImageNode.mm in Sources */, @@ -1525,7 +1509,6 @@ 0549634A1A1EA066000F8E56 /* ASBasicImageDownloader.mm in Sources */, 058D0A14195D050800B7D73C /* ASDisplayNode.mm in Sources */, 058D0A1B195D050800B7D73C /* ASMutableAttributedStringBuilder.m in Sources */, - 9C3061081B857EC400D0530B /* ASBaselineLayoutSpec.mm in Sources */, 058D0A2B195D050800B7D73C /* ASImageNode+CGExtras.m in Sources */, 058D0A24195D050800B7D73C /* _ASAsyncTransactionGroup.m in Sources */, 058D0A1C195D050800B7D73C /* ASTextNodeCoreTextAdditions.m in Sources */, @@ -1587,10 +1570,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9C3061091B857EC400D0530B /* ASBaselineLayoutSpec.mm in Sources */, 34EFC7641B701CC600AD841F /* ASCenterLayoutSpec.mm in Sources */, B350623B1B010EFD0018CF92 /* NSMutableAttributedString+TextKitAdditions.m in Sources */, - 9C204A671B86349B00313849 /* ASBaselinePositionedLayout.mm in Sources */, B35062401B010EFD0018CF92 /* _ASAsyncTransactionContainer.m in Sources */, B35062311B010EFD0018CF92 /* ASTextNodeRenderer.mm in Sources */, B35062051B010EFD0018CF92 /* ASMultiplexImageNode.mm in Sources */, @@ -1635,6 +1616,7 @@ B35062031B010EFD0018CF92 /* ASImageNode.mm in Sources */, B35062091B010EFD0018CF92 /* ASScrollNode.m in Sources */, B35062251B010EFD0018CF92 /* ASMutableAttributedStringBuilder.m in Sources */, + 9C8221981BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */, 430E7C921B4C23F100697A4C /* ASIndexPath.m in Sources */, 34EFC7741B701D0A00AD841F /* ASStaticLayoutSpec.mm in Sources */, B35062381B010EFD0018CF92 /* ASTextNodeWordKerner.m in Sources */, diff --git a/AsyncDisplayKit/Layout/ASBaselineLayoutSpec.h b/AsyncDisplayKit/Layout/ASBaselineLayoutSpec.h deleted file mode 100644 index d147c76700..0000000000 --- a/AsyncDisplayKit/Layout/ASBaselineLayoutSpec.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2014-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import -#import - -typedef NS_ENUM(NSUInteger, ASBaselineLayoutBaselineAlignment) { - /** No baseline alignment. This is only valid for a vertical stack */ - ASBaselineLayoutBaselineAlignmentNone, - /** Align all children to the first baseline. This is only valid for a horizontal stack */ - ASBaselineLayoutBaselineAlignmentFirst, - /** Align all children to the last baseline. This is useful when a text node wraps and you want to align - to the bottom baseline. This is only valid for a horizontal stack */ - ASBaselineLayoutBaselineAlignmentLast, -}; - -/** - A specialized version of a stack layout that aligns its children on a baseline. This spec only works with - ASBaselineLayoutable children. - - If the spec is created with a horizontal direction, the children will be laid on a common baseline. - If the spec is created with a vertical direction, a child's vertical spacing will be measured from its - baseline instead of from the child's bounding box. -*/ -@interface ASBaselineLayoutSpec : ASLayoutSpec - -/** Specifies the direction children are stacked in. */ -@property (nonatomic, assign) ASStackLayoutDirection direction; -/** The amount of space between each child. */ -@property (nonatomic, assign) CGFloat spacing; -/** The amount of space between each child. */ -@property (nonatomic, assign) ASStackLayoutJustifyContent justifyContent; -/** Orientation of children along cross axis */ -@property (nonatomic, assign) ASStackLayoutAlignItems alignItems; -/** The type of baseline alignment */ -@property (nonatomic, assign) ASBaselineLayoutBaselineAlignment baselineAlignment; - -/** - @param direction The direction of the stack view (horizontal or vertical) - @param spacing The spacing between the children - @param baselineAlignment The baseline to align to - @param justifyContent If no children are flexible, this describes how to fill any extra space - @param alignItems Orientation of the children along the cross axis - @param children ASLayoutable children to be positioned. - */ -+ (instancetype)baselineLayoutSpecWithDirection:(ASStackLayoutDirection)direction - spacing:(CGFloat)spacing - baselineAlignment:(ASBaselineLayoutBaselineAlignment)baselineAlignment - justifyContent:(ASStackLayoutJustifyContent)justifyContent - alignItems:(ASStackLayoutAlignItems)alignItems - children:(NSArray *)children; - -@end diff --git a/AsyncDisplayKit/Layout/ASBaselineLayoutSpec.mm b/AsyncDisplayKit/Layout/ASBaselineLayoutSpec.mm deleted file mode 100644 index 50139a548b..0000000000 --- a/AsyncDisplayKit/Layout/ASBaselineLayoutSpec.mm +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2014-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - */ - -#import "ASBaselineLayoutSpec.h" - -#import -#import - -#import "ASBaseDefines.h" -#import "ASInternalHelpers.h" - -#import "ASLayoutSpecUtilities.h" -#import "ASStackLayoutSpecUtilities.h" -#import "ASStackPositionedLayout.h" -#import "ASStackUnpositionedLayout.h" -#import "ASBaselinePositionedLayout.h" -#import "ASThread.h" - - -@implementation ASBaselineLayoutSpec - -- (instancetype)initWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing baselineAlignment:(ASBaselineLayoutBaselineAlignment)baselineAlignment justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray *)children -{ - if (!(self = [super init])) { - return nil; - } - - ASDisplayNodeAssert((direction == ASStackLayoutDirectionHorizontal && baselineAlignment != ASBaselineLayoutBaselineAlignmentNone) || direction == ASStackLayoutDirectionVertical, @"baselineAlignment is set to none. If you don't need baseline alignment please use ASStackLayoutSpec"); - _direction = direction; - _alignItems = alignItems; - _spacing = spacing; - _justifyContent = justifyContent; - _baselineAlignment = baselineAlignment; - - [self setChildren:children]; - return self; -} - - -+ (instancetype)baselineLayoutSpecWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing baselineAlignment:(ASBaselineLayoutBaselineAlignment)baselineAlignment justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray *)children -{ - return [[ASBaselineLayoutSpec alloc] initWithDirection:direction spacing:spacing baselineAlignment:baselineAlignment justifyContent:justifyContent alignItems:alignItems children:children]; -} - -- (ASLayout *)measureWithSizeRange:(ASSizeRange)constrainedSize -{ - ASStackLayoutSpecStyle stackStyle = {.direction = _direction, .spacing = _spacing, .justifyContent = _justifyContent, .alignItems = _alignItems}; - ASBaselineLayoutSpecStyle style = { .baselineAlignment = _baselineAlignment, .stackLayoutStyle = stackStyle }; - - std::vector> stackChildren = std::vector>(); - for (id child in self.children) { - stackChildren.push_back(child); - } - - const auto unpositionedLayout = ASStackUnpositionedLayout::compute(stackChildren, stackStyle, constrainedSize); - const auto positionedLayout = ASStackPositionedLayout::compute(unpositionedLayout, stackStyle, constrainedSize); - const auto baselinePositionedLayout = ASBaselinePositionedLayout::compute(positionedLayout, style, constrainedSize); - - const CGSize finalSize = directionSize(stackStyle.direction, unpositionedLayout.stackDimensionSum, baselinePositionedLayout.crossSize); - - NSArray *sublayouts = [NSArray arrayWithObjects:&baselinePositionedLayout.sublayouts[0] count:baselinePositionedLayout.sublayouts.size()]; - - return [ASLayout layoutWithLayoutableObject:self - size:ASSizeRangeClamp(constrainedSize, finalSize) - sublayouts:sublayouts]; -} - -- (void)setChild:(id)child forIdentifier:(NSString *)identifier -{ - ASDisplayNodeAssert(NO, @"ASBaselineLayoutSpec only supports setChildren"); -} - -@end diff --git a/AsyncDisplayKit/Layout/ASBaselineLayoutable.h b/AsyncDisplayKit/Layout/ASBaselineLayoutable.h deleted file mode 100644 index 7e52b2c056..0000000000 --- a/AsyncDisplayKit/Layout/ASBaselineLayoutable.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright (c) 2014-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@protocol ASBaselineLayoutable - -/** - * @abstract The distance from the top of the layoutable object to its baseline - */ -@property (nonatomic, readwrite) CGFloat ascender; - -/** - * @abstract The distance from the bottom of the layoutable object to its baseline - */ -@property (nonatomic, readwrite) CGFloat descender; - -@end diff --git a/AsyncDisplayKit/Layout/ASLayoutOptions.h b/AsyncDisplayKit/Layout/ASLayoutOptions.h index 022bbb61f3..36058439f3 100644 --- a/AsyncDisplayKit/Layout/ASLayoutOptions.h +++ b/AsyncDisplayKit/Layout/ASLayoutOptions.h @@ -12,11 +12,10 @@ @protocol ASLayoutable; -#import #import #import -@interface ASLayoutOptions : NSObject +@interface ASLayoutOptions : NSObject + (void)setDefaultLayoutOptionsClass:(Class)defaultLayoutOptionsClass; + (Class)defaultLayoutOptionsClass; @@ -36,9 +35,6 @@ @property (nonatomic, readwrite) BOOL flexShrink; @property (nonatomic, readwrite) ASRelativeDimension flexBasis; @property (nonatomic, readwrite) ASStackLayoutAlignSelf alignSelf; - -#pragma mark - ASBaselineLayoutable - @property (nonatomic, readwrite) CGFloat ascender; @property (nonatomic, readwrite) CGFloat descender; diff --git a/AsyncDisplayKit/Layout/ASLayoutable.h b/AsyncDisplayKit/Layout/ASLayoutable.h index 38644c0b60..8d46caf2f6 100644 --- a/AsyncDisplayKit/Layout/ASLayoutable.h +++ b/AsyncDisplayKit/Layout/ASLayoutable.h @@ -12,7 +12,6 @@ #import #import #import -#import #import #import @@ -25,7 +24,7 @@ * so that instances of that class can be used to build layout trees. The protocol also provides information * about how an object should be laid out within an ASStackLayoutSpec. */ -@protocol ASLayoutable +@protocol ASLayoutable /** * @abstract Calculate a layout based on given size range. diff --git a/AsyncDisplayKit/Layout/ASStackLayoutDefines.h b/AsyncDisplayKit/Layout/ASStackLayoutDefines.h index d7737f7eab..82d1aa0daf 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutDefines.h +++ b/AsyncDisplayKit/Layout/ASStackLayoutDefines.h @@ -44,7 +44,11 @@ typedef NS_ENUM(NSUInteger, ASStackLayoutAlignItems) { /** Center children on cross axis */ ASStackLayoutAlignItemsCenter, /** Expand children to fill cross axis */ - ASStackLayoutAlignItemsStretch + ASStackLayoutAlignItemsStretch, + /** Children align to their first baseline. Only available for horizontal stack nodes */ + ASStackLayoutAlignItemsBaselineFirst, + /** Children align to their last baseline. Only available for horizontal stack nodes */ + ASStackLayoutAlignItemsBaselineLast, }; /** @@ -62,4 +66,8 @@ typedef NS_ENUM(NSUInteger, ASStackLayoutAlignSelf) { ASStackLayoutAlignSelfCenter, /** Expand to fill cross axis */ ASStackLayoutAlignSelfStretch, + /** Children align to their first baseline. Only available for horizontal stack nodes */ + ASStackLayoutAlignSelfBaselineFirst, + /** Children align to their last baseline. Only available for horizontal stack nodes */ + ASStackLayoutAlignSelfBaselineLast, }; diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.h b/AsyncDisplayKit/Layout/ASStackLayoutSpec.h index b5a126c5cb..dd331f1405 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.h @@ -43,6 +43,8 @@ @property (nonatomic, assign) ASStackLayoutJustifyContent justifyContent; /** Orientation of children along cross axis */ @property (nonatomic, assign) ASStackLayoutAlignItems alignItems; +/** 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 */ +@property (nonatomic, assign) BOOL baselineRelativeArrangement; - (instancetype)init; diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm index ef109d47ae..afcb996425 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm @@ -17,12 +17,16 @@ #import "ASInternalHelpers.h" #import "ASLayoutSpecUtilities.h" +#import "ASStackBaselinePositionedLayout.h" #import "ASStackLayoutSpecUtilities.h" #import "ASStackPositionedLayout.h" #import "ASStackUnpositionedLayout.h" #import "ASThread.h" @implementation ASStackLayoutSpec +{ + ASDN::RecursiveMutex _propertyLock; +} - (instancetype)init { @@ -72,6 +76,12 @@ _spacing = spacing; } +- (void)setBaselineRelativeArrangement:(BOOL)baselineRelativeArrangement +{ + ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); + _baselineRelativeArrangement = baselineRelativeArrangement; +} + - (void)setChild:(id)child forIdentifier:(NSString *)identifier { ASDisplayNodeAssert(NO, @"ASStackLayoutSpec only supports setChildren"); @@ -79,16 +89,33 @@ - (ASLayout *)measureWithSizeRange:(ASSizeRange)constrainedSize { - ASStackLayoutSpecStyle style = {.direction = _direction, .spacing = _spacing, .justifyContent = _justifyContent, .alignItems = _alignItems}; + ASStackLayoutSpecStyle style = {.direction = _direction, .spacing = _spacing, .justifyContent = _justifyContent, .alignItems = _alignItems, .baselineRelativeArrangement = _baselineRelativeArrangement}; + BOOL needsBaselinePass = _baselineRelativeArrangement || _alignItems == ASStackLayoutAlignItemsBaselineFirst || _alignItems == ASStackLayoutAlignItemsBaselineLast; + std::vector> stackChildren = std::vector>(); for (id child in self.children) { stackChildren.push_back(child); + needsBaselinePass |= child.alignSelf == ASStackLayoutAlignSelfBaselineFirst || child.alignSelf == ASStackLayoutAlignSelfBaselineLast; } const auto unpositionedLayout = ASStackUnpositionedLayout::compute(stackChildren, style, constrainedSize); const auto positionedLayout = ASStackPositionedLayout::compute(unpositionedLayout, style, constrainedSize); - const CGSize finalSize = directionSize(style.direction, unpositionedLayout.stackDimensionSum, positionedLayout.crossSize); - NSArray *sublayouts = [NSArray arrayWithObjects:&positionedLayout.sublayouts[0] count:positionedLayout.sublayouts.size()]; + + CGSize finalSize = CGSizeZero; + NSArray *sublayouts = nil; + if (needsBaselinePass) { + const auto baselinePositionedLayout = ASStackBaselinePositionedLayout::compute(positionedLayout, style, constrainedSize); + ASDN::MutexLocker l(_propertyLock); + self.ascender = baselinePositionedLayout.ascender; + self.descender = baselinePositionedLayout.descender; + + finalSize = directionSize(style.direction, unpositionedLayout.stackDimensionSum, baselinePositionedLayout.crossSize); + sublayouts = [NSArray arrayWithObjects:&baselinePositionedLayout.sublayouts[0] count:baselinePositionedLayout.sublayouts.size()]; + } else { + finalSize = directionSize(style.direction, unpositionedLayout.stackDimensionSum, positionedLayout.crossSize); + sublayouts = [NSArray arrayWithObjects:&positionedLayout.sublayouts[0] count:positionedLayout.sublayouts.size()]; + } + return [ASLayout layoutWithLayoutableObject:self size:ASSizeRangeClamp(constrainedSize, finalSize) sublayouts:sublayouts]; diff --git a/AsyncDisplayKit/Layout/ASStackLayoutable.h b/AsyncDisplayKit/Layout/ASStackLayoutable.h index e26d0a0210..5b1984929a 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutable.h +++ b/AsyncDisplayKit/Layout/ASStackLayoutable.h @@ -50,4 +50,14 @@ */ @property (nonatomic, readwrite) ASStackLayoutAlignSelf alignSelf; +/** + * @abstract Used for baseline alignment. The distance from the top of the object to its baseline. + */ +@property (nonatomic, readwrite) CGFloat ascender; + +/** + * @abstract Used for baseline alignment. The distance from the baseline of the object to its bottom. + */ +@property (nonatomic, readwrite) CGFloat descender; + @end diff --git a/AsyncDisplayKit/Private/ASBaselinePositionedLayout.h b/AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.h similarity index 52% rename from AsyncDisplayKit/Private/ASBaselinePositionedLayout.h rename to AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.h index e3857d5ed4..6f208e1b29 100644 --- a/AsyncDisplayKit/Private/ASBaselinePositionedLayout.h +++ b/AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.h @@ -10,25 +10,16 @@ #import "ASLayout.h" #import "ASDimension.h" -#import "ASBaselineLayoutSpec.h" #import "ASStackPositionedLayout.h" -typedef struct { - /** Describes how the stack will be laid out */ - ASStackLayoutSpecStyle stackLayoutStyle; - - /** The type of baseline alignment */ - ASBaselineLayoutBaselineAlignment baselineAlignment; -} ASBaselineLayoutSpecStyle; - -struct ASBaselinePositionedLayout { +struct ASStackBaselinePositionedLayout { const std::vector sublayouts; const CGFloat crossSize; const CGFloat ascender; const CGFloat descender; /** Given a positioned layout, computes each child position using baseline alignment. */ - static ASBaselinePositionedLayout compute(const ASStackPositionedLayout &positionedLayout, - const ASBaselineLayoutSpecStyle &style, - const ASSizeRange &constrainedSize); + static ASStackBaselinePositionedLayout compute(const ASStackPositionedLayout &positionedLayout, + const ASStackLayoutSpecStyle &style, + const ASSizeRange &constrainedSize); }; diff --git a/AsyncDisplayKit/Private/ASBaselinePositionedLayout.mm b/AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.mm similarity index 82% rename from AsyncDisplayKit/Private/ASBaselinePositionedLayout.mm rename to AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.mm index bf01ff179e..aad53bad80 100644 --- a/AsyncDisplayKit/Private/ASBaselinePositionedLayout.mm +++ b/AsyncDisplayKit/Private/ASStackBaselinePositionedLayout.mm @@ -8,40 +8,41 @@ * */ -#import "ASBaselinePositionedLayout.h" +#import "ASStackBaselinePositionedLayout.h" #import "ASLayoutSpecUtilities.h" #import "ASStackLayoutSpecUtilities.h" #import "ASLayoutOptions.h" -static CGFloat baselineForItem(const ASBaselineLayoutSpecStyle &style, +static CGFloat baselineForItem(const ASStackLayoutSpecStyle &style, const ASLayout *layout) { __weak id child = layout.layoutableObject; - switch (style.baselineAlignment) { - case ASBaselineLayoutBaselineAlignmentNone: - return 0; - case ASBaselineLayoutBaselineAlignmentFirst: + switch (style.alignItems) { + case ASStackLayoutAlignItemsBaselineFirst: return child.layoutOptions.ascender; - case ASBaselineLayoutBaselineAlignmentLast: + case ASStackLayoutAlignItemsBaselineLast: return layout.size.height + child.layoutOptions.descender; + default: + return 0; } } -static CGFloat baselineOffset(const ASBaselineLayoutSpecStyle &style, +static CGFloat baselineOffset(const ASStackLayoutSpecStyle &style, const ASLayout *l, const CGFloat maxAscender, const CGFloat maxBaseline) { - if (style.stackLayoutStyle.direction == ASStackLayoutDirectionHorizontal) { + if (style.direction == ASStackLayoutDirectionHorizontal) { __weak id child = l.layoutableObject; - switch (style.baselineAlignment) { - case ASBaselineLayoutBaselineAlignmentFirst: + switch (style.alignItems) { + case ASStackLayoutAlignItemsBaselineFirst: return maxAscender - child.layoutOptions.ascender; - case ASBaselineLayoutBaselineAlignmentLast: + case ASStackLayoutAlignItemsBaselineLast: return maxBaseline - baselineForItem(style, l); - case ASBaselineLayoutBaselineAlignmentNone: + + default: return 0; } } @@ -56,12 +57,10 @@ static CGFloat maxDimensionForLayout(const ASLayout *l, return maxDimension; } -ASBaselinePositionedLayout ASBaselinePositionedLayout::compute(const ASStackPositionedLayout &positionedLayout, - const ASBaselineLayoutSpecStyle &style, - const ASSizeRange &constrainedSize) +ASStackBaselinePositionedLayout ASStackBaselinePositionedLayout::compute(const ASStackPositionedLayout &positionedLayout, + const ASStackLayoutSpecStyle &style, + const ASSizeRange &constrainedSize) { - ASStackLayoutSpecStyle stackStyle = style.stackLayoutStyle; - /* Step 1: Look at each child and determine the distance from the top of the child node it's baseline. For example, let's say we have the following two text nodes and want to align them to the first baseline: @@ -108,13 +107,13 @@ ASBaselinePositionedLayout ASBaselinePositionedLayout::compute(const ASStackPosi BOOL first = YES; auto stackedChildren = AS::map(positionedLayout.sublayouts, [&](ASLayout *l) -> ASLayout *{ __weak id child = l.layoutableObject; - p = p + directionPoint(stackStyle.direction, child.layoutOptions.spacingBefore, 0); + p = p + directionPoint(style.direction, child.layoutOptions.spacingBefore, 0); if (first) { // if this is the first item use the previously computed start point p = l.position; } else { // otherwise add the stack spacing - p = p + directionPoint(stackStyle.direction, stackStyle.spacing, 0); + p = p + directionPoint(style.direction, style.spacing, 0); } first = NO; @@ -124,10 +123,10 @@ ASBaselinePositionedLayout ASBaselinePositionedLayout::compute(const ASStackPosi // If we are a vertical stack, add the item's descender (it is negative) to the offset for the next node. This will ensure we are spacing // node from baselines and not bounding boxes. CGFloat spacingAfterBaseline = 0; - if (stackStyle.direction == ASStackLayoutDirectionVertical) { + if (style.direction == ASStackLayoutDirectionVertical) { spacingAfterBaseline = child.layoutOptions.descender; } - p = p + directionPoint(stackStyle.direction, stackDimension(stackStyle.direction, l.size) + child.layoutOptions.spacingAfter + spacingAfterBaseline, 0); + p = p + directionPoint(style.direction, stackDimension(style.direction, l.size) + child.layoutOptions.spacingAfter + spacingAfterBaseline, 0); return l; }); @@ -143,11 +142,11 @@ ASBaselinePositionedLayout ASBaselinePositionedLayout::compute(const ASStackPosi */ const auto it = std::max_element(stackedChildren.begin(), stackedChildren.end(), [&](ASLayout *a, ASLayout *b) { - return maxDimensionForLayout(a, stackStyle) < maxDimensionForLayout(b, stackStyle); + return maxDimensionForLayout(a, style) < maxDimensionForLayout(b, style); }); - const auto largestChildCrossSize = it == stackedChildren.end() ? 0 : maxDimensionForLayout(*it, stackStyle); - const auto minCrossSize = crossDimension(stackStyle.direction, constrainedSize.min); - const auto maxCrossSize = crossDimension(stackStyle.direction, constrainedSize.max); + const auto largestChildCrossSize = it == stackedChildren.end() ? 0 : maxDimensionForLayout(*it, style); + const auto minCrossSize = crossDimension(style.direction, constrainedSize.min); + const auto maxCrossSize = crossDimension(style.direction, constrainedSize.max); const CGFloat crossSize = MIN(MAX(minCrossSize, largestChildCrossSize), maxCrossSize); /* diff --git a/AsyncDisplayKit/Private/ASStackLayoutSpecUtilities.h b/AsyncDisplayKit/Private/ASStackLayoutSpecUtilities.h index 33895b9bd5..2b073c106a 100644 --- a/AsyncDisplayKit/Private/ASStackLayoutSpecUtilities.h +++ b/AsyncDisplayKit/Private/ASStackLayoutSpecUtilities.h @@ -15,6 +15,7 @@ typedef struct { CGFloat spacing; ASStackLayoutJustifyContent justifyContent; ASStackLayoutAlignItems alignItems; + BOOL baselineRelativeArrangement; } ASStackLayoutSpecStyle; inline CGFloat stackDimension(const ASStackLayoutDirection direction, const CGSize size) @@ -62,6 +63,10 @@ inline ASStackLayoutAlignItems alignment(ASStackLayoutAlignSelf childAlignment, return ASStackLayoutAlignItemsStart; case ASStackLayoutAlignSelfStretch: return ASStackLayoutAlignItemsStretch; + case ASStackLayoutAlignSelfBaselineFirst: + return ASStackLayoutAlignItemsBaselineFirst; + case ASStackLayoutAlignSelfBaselineLast: + return ASStackLayoutAlignItemsBaselineLast; case ASStackLayoutAlignSelfAuto: default: return stackAlignment; diff --git a/AsyncDisplayKit/Private/ASStackPositionedLayout.mm b/AsyncDisplayKit/Private/ASStackPositionedLayout.mm index 95b445043c..549e150876 100644 --- a/AsyncDisplayKit/Private/ASStackPositionedLayout.mm +++ b/AsyncDisplayKit/Private/ASStackPositionedLayout.mm @@ -25,6 +25,8 @@ static CGFloat crossOffset(const ASStackLayoutSpecStyle &style, return crossSize - crossDimension(style.direction, l.layout.size); case ASStackLayoutAlignItemsCenter: return ASFloorPixelValue((crossSize - crossDimension(style.direction, l.layout.size)) / 2); + case ASStackLayoutAlignItemsBaselineFirst: + case ASStackLayoutAlignItemsBaselineLast: case ASStackLayoutAlignItemsStart: case ASStackLayoutAlignItemsStretch: return 0;