Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions AsyncDisplayKit/ASScrollNode.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
//

#import <AsyncDisplayKit/ASDisplayNode.h>
#import <AsyncDisplayKit/ASScrollDirection.h>

NS_ASSUME_NONNULL_BEGIN

Expand All @@ -33,6 +34,18 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nonatomic, assign) BOOL automaticallyManagesContentSize;

/**
* @abstract This property controls how the constrainedSize is interpreted when sizing the content.
* if you are using automaticallyManagesContentSize, it can be crucial to ensure that the sizing is
* done how you expect.
* Vertical: The constrainedSize is interpreted as having unbounded .height (CGFLOAT_MAX), allowing
* stacks and other content in the layout spec to expand and result in scrollable content.
* Horizontal: The constrainedSize is interpreted as having unbounded .width (CGFLOAT_MAX), ...
* Vertical & Horizontal: the constrainedSize is interpreted as unbounded in both directions.
* @default ASScrollDirectionVerticalDirections
*/
@property (nonatomic, assign) ASScrollDirection scrollableDirections;

@end

NS_ASSUME_NONNULL_END
36 changes: 32 additions & 4 deletions AsyncDisplayKit/ASScrollNode.mm
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ - (void)didMoveToWindow

@implementation ASScrollNode
{
ASScrollDirection _scrollableDirections;
BOOL _automaticallyManagesContentSize;
CGSize _contentCalculatedSizeFromLayout;
}
Expand All @@ -70,12 +71,20 @@ - (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize
restrictedToSize:(ASLayoutElementSize)size
relativeToParentSize:(CGSize)parentSize
{
ASLayout *layout = [super calculateLayoutThatFits:constrainedSize
ASDN::MutexLocker l(__instanceLock__); // Lock for using our instance variables.

ASSizeRange contentConstrainedSize = constrainedSize;
if (ASScrollDirectionContainsVerticalDirection(_scrollableDirections)) {
contentConstrainedSize.max.height = CGFLOAT_MAX;
}
if (ASScrollDirectionContainsHorizontalDirection(_scrollableDirections)) {
contentConstrainedSize.max.width = CGFLOAT_MAX;
}

ASLayout *layout = [super calculateLayoutThatFits:contentConstrainedSize
restrictedToSize:size
relativeToParentSize:parentSize];

ASDN::MutexLocker l(__instanceLock__); // Lock for using our two instance variables.


if (_automaticallyManagesContentSize) {
// To understand this code, imagine we're containing a horizontal stack set within a vertical table node.
// Our parentSize is fixed ~375pt width, but 0 - INF height. Our stack measures 1000pt width, 50pt height.
Expand Down Expand Up @@ -124,6 +133,25 @@ - (void)setAutomaticallyManagesContentSize:(BOOL)automaticallyManagesContentSize
{
ASDN::MutexLocker l(__instanceLock__);
_automaticallyManagesContentSize = automaticallyManagesContentSize;
if (_automaticallyManagesContentSize == YES
&& ASScrollDirectionContainsVerticalDirection(_scrollableDirections) == NO
&& ASScrollDirectionContainsHorizontalDirection(_scrollableDirections) == NO) {
// Set the @default value, for more user-friendly behavior of the most
// common use cases of .automaticallyManagesContentSize.
_scrollableDirections = ASScrollDirectionVerticalDirections;
}
}

- (ASScrollDirection)scrollableDirections
{
ASDN::MutexLocker l(__instanceLock__);
return _scrollableDirections;
}

- (void)setScrollableDirections:(ASScrollDirection)scrollableDirections
{
ASDN::MutexLocker l(__instanceLock__);
_scrollableDirections = scrollableDirections;
}

@end