[ASScrollNode] Add .scrollDirection property so that internal content sizing can be easily "unlimited" in the direction of scrolling. (#3001)

This commit is contained in:
appleguy 2017-02-08 16:39:05 -08:00 committed by GitHub
parent ada553c5a7
commit ca8fcdfe49
2 changed files with 45 additions and 4 deletions

View File

@ -9,6 +9,7 @@
//
#import <AsyncDisplayKit/ASDisplayNode.h>
#import <AsyncDisplayKit/ASScrollDirection.h>
NS_ASSUME_NONNULL_BEGIN
@ -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

View File

@ -56,6 +56,7 @@
@implementation ASScrollNode
{
ASScrollDirection _scrollableDirections;
BOOL _automaticallyManagesContentSize;
CGSize _contentCalculatedSizeFromLayout;
}
@ -70,12 +71,20 @@
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.
@ -124,6 +133,25 @@
{
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