// // ASCollectionFlowLayoutDelegate.m // Texture // // 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 /ASDK-Licenses directory of this source tree. An additional // grant of patent rights can be found in the PATENTS file in the same directory. // // Modifications to this file made after 4/13/2017 are: Copyright (c) 2017-present, // Pinterest, Inc. Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // #import #import #import #import #import #import #import #import @implementation ASCollectionFlowLayoutDelegate { ASScrollDirection _scrollableDirections; } - (instancetype)init { self = [super init]; if (self) { _scrollableDirections = ASScrollDirectionVerticalDirections; } return self; } - (instancetype)initWithScrollableDirections:(ASScrollDirection)scrollableDirections { self = [self init]; if (self) { _scrollableDirections = scrollableDirections; } return self; } - (ASSizeRange)sizeRangeThatFits:(CGSize)viewportSize { ASSizeRange sizeRange = ASSizeRangeUnconstrained; if (ASScrollDirectionContainsVerticalDirection(_scrollableDirections) == NO) { sizeRange.min.height = viewportSize.height; sizeRange.max.height = viewportSize.height; } if (ASScrollDirectionContainsHorizontalDirection(_scrollableDirections) == NO) { sizeRange.min.width = viewportSize.width; sizeRange.max.width = viewportSize.width; } return sizeRange; } - (id)additionalInfoForLayoutWithElements:(ASElementMap *)elements { return nil; } - (ASCollectionLayoutState *)calculateLayoutWithContext:(ASCollectionLayoutContext *)context { ASElementMap *elements = context.elements; NSMutableArray *children = ASArrayByFlatMapping(elements.itemElements, ASCollectionElement *element, element.node); if (children.count == 0) { return [[ASCollectionLayoutState alloc] initWithElements:elements contentSize:CGSizeZero elementToLayoutArrtibutesMap:[NSMapTable weakToStrongObjectsMapTable]]; } ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart flexWrap:ASStackLayoutFlexWrapWrap alignContent:ASStackLayoutAlignContentStart children:children]; stackSpec.concurrent = YES; ASLayout *layout = [stackSpec layoutThatFits:[self sizeRangeThatFits:context.viewportSize]]; return [[ASCollectionLayoutState alloc] initWithElements:elements layout:layout]; } @end