mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-05 20:22:15 +00:00
* Introduce ASCollectionViewLayout - `ASCollectionViewLayout` is an async `UICollectionViewLayout` that encapsulates its layout calculation logic into a separate thread-safe object which can be used ahead of time and/or on multiple threads. - `ASDataController` now can prepare for a new layout resulted from a change set before `ASCollectionView` even knows about it. By the time the change set it ready to be consumed by `ASCollectionView`, its new layout is also ready. - New `ASCollectionViewLayoutCalculating` protocol that is simple and generic enough that many types of calculators can be built on top. `ASCollectionViewLayoutSpecCalculator` conforms to `ASCollectionViewLayoutCalculating` protocol and can be backed by any layout spec (e.g `ASStackLayoutSpec`, `PIMasonryLayoutSpec`, etc). We can even build a `ASCollectionViewLayoutYogaCalculator` that uses Yoga internally. - A built-in `ASCollectionViewFlowLayoutCalculator` that is a subclass of `ASCollectionViewLayoutSpecCalculator` and uses a multi-threaded multi-line `ASStackLayoutSpec` internally. The result is a performant and thread-safe flow layout calculator. - Finally, `ASCollectionViewLayout` can be subclassed to handle a specific type of calculator with optimizations implemented based on the knowledge of such calculator. For example, `ASCollectionViewFlowLayout` can have a highly optimized implementation of `-layoutAttributesForElementsInRect:`. Protocolize layout calculator providing and consuming Add flex wrap documentation Add a `multithreaded` flag to ASStackLayoutSpec that forces it to dispatch even if it's off main - Update ASCollectionViewFlowLayoutSpecCalculator to use that flag. Minor change in ASCollectionViewLayout Implement Mosaic layout calculator Minor change Fix project file Rename and fix project file Skip fetching constrained size only if a layout calculator is available Update examples/ASCollectionView Remove unnecessary change in ASTableView Address comments Rename collection view calculator protocols Minor changes after rebasing with master Add ASLegacyCollectionLayoutCalculator for backward compatibility Remove ASCollectionLayoutSpecCalculator Remove ASLegacyCollectionLayoutCalculator Introduce ASCollectionLayout - A wrapper object that contains content size and an element to rect table. - Collection layout calculators to return this new object instead of an ASLayout. Before adding a content cache Finishing hooking up ASCollectionLayoutDataSource to ASCollectionNode Stash Finish ASCollectionLayout Rough impl of ASCollectionFlowLayout Revert changes in CustomCollectionView example Move ASRectTable back to Private * Rename ASCollectionContentAttributes to ASCollectionLayoutState * Address other comments * Introduce ASCollectionLayoutDelegate and make ASCollectionLayout private * Address comments * API tweaks: - Replace `-layoutContextWithElementMap:` in ASCollectionLayoutDelegate with `-additionalInfoForLayoutWithElements:`. The returned object is then stored in ASCollectionLayoutContext for later lookups. - ASCollectionLayoutContext has no public initializer. - ASDataControllerLayoutDelegate no longer requires a context of type ASCollectionLayoutContext but simply an `id`. This helps decouple ASDataController and ASCollectionLayout. - Rename `elementMap` to `elements`. - Rename `visibleMap` to `visibleElements`. - Other minor changes. * Rename ASCGSizeHash to ASHashFromCGSize * Make sure to call super in -[ASCollectionLayout prepareLayout] * Update example/ASCollectionView to use ASCollectionFlowLayoutDelegate * Remove unnecessary change
144 lines
5.9 KiB
Objective-C
144 lines
5.9 KiB
Objective-C
//
|
|
// ASStackLayoutDefines.h
|
|
// AsyncDisplayKit
|
|
//
|
|
// 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 <AsyncDisplayKit/ASBaseDefines.h>
|
|
|
|
/** The direction children are stacked in */
|
|
typedef NS_ENUM(NSUInteger, ASStackLayoutDirection) {
|
|
/** Children are stacked vertically */
|
|
ASStackLayoutDirectionVertical,
|
|
/** Children are stacked horizontally */
|
|
ASStackLayoutDirectionHorizontal,
|
|
};
|
|
|
|
/** If no children are flexible, how should this spec justify its children in the available space? */
|
|
typedef NS_ENUM(NSUInteger, ASStackLayoutJustifyContent) {
|
|
/**
|
|
On overflow, children overflow out of this spec's bounds on the right/bottom side.
|
|
On underflow, children are left/top-aligned within this spec's bounds.
|
|
*/
|
|
ASStackLayoutJustifyContentStart,
|
|
/**
|
|
On overflow, children are centered and overflow on both sides.
|
|
On underflow, children are centered within this spec's bounds in the stacking direction.
|
|
*/
|
|
ASStackLayoutJustifyContentCenter,
|
|
/**
|
|
On overflow, children overflow out of this spec's bounds on the left/top side.
|
|
On underflow, children are right/bottom-aligned within this spec's bounds.
|
|
*/
|
|
ASStackLayoutJustifyContentEnd,
|
|
/**
|
|
On overflow or if the stack has only 1 child, this value is identical to ASStackLayoutJustifyContentStart.
|
|
Otherwise, the starting edge of the first child is at the starting edge of the stack,
|
|
the ending edge of the last child is at the ending edge of the stack, and the remaining children
|
|
are distributed so that the spacing between any two adjacent ones is the same.
|
|
If there is a remaining space after spacing division, it is combined with the last spacing (i.e the one between the last 2 children).
|
|
*/
|
|
ASStackLayoutJustifyContentSpaceBetween,
|
|
/**
|
|
On overflow or if the stack has only 1 child, this value is identical to ASStackLayoutJustifyContentCenter.
|
|
Otherwise, children are distributed such that the spacing between any two adjacent ones is the same,
|
|
and the spacing between the first/last child and the stack edges is half the size of the spacing between children.
|
|
If there is a remaining space after spacing division, it is combined with the last spacing (i.e the one between the last child and the stack ending edge).
|
|
*/
|
|
ASStackLayoutJustifyContentSpaceAround
|
|
};
|
|
|
|
/** Orientation of children along cross axis */
|
|
typedef NS_ENUM(NSUInteger, ASStackLayoutAlignItems) {
|
|
/** Align children to start of cross axis */
|
|
ASStackLayoutAlignItemsStart,
|
|
/** Align children with end of cross axis */
|
|
ASStackLayoutAlignItemsEnd,
|
|
/** Center children on cross axis */
|
|
ASStackLayoutAlignItemsCenter,
|
|
/** Expand children to fill cross axis */
|
|
ASStackLayoutAlignItemsStretch,
|
|
/** Children align to their first baseline. Only available for horizontal stack spec */
|
|
ASStackLayoutAlignItemsBaselineFirst,
|
|
/** Children align to their last baseline. Only available for horizontal stack spec */
|
|
ASStackLayoutAlignItemsBaselineLast,
|
|
ASStackLayoutAlignItemsNotSet
|
|
};
|
|
|
|
/**
|
|
Each child may override their parent stack's cross axis alignment.
|
|
@see ASStackLayoutAlignItems
|
|
*/
|
|
typedef NS_ENUM(NSUInteger, ASStackLayoutAlignSelf) {
|
|
/** Inherit alignment value from containing stack. */
|
|
ASStackLayoutAlignSelfAuto,
|
|
/** Align to start of cross axis */
|
|
ASStackLayoutAlignSelfStart,
|
|
/** Align with end of cross axis */
|
|
ASStackLayoutAlignSelfEnd,
|
|
/** Center on cross axis */
|
|
ASStackLayoutAlignSelfCenter,
|
|
/** Expand to fill cross axis */
|
|
ASStackLayoutAlignSelfStretch,
|
|
};
|
|
|
|
/** Whether children are stacked into a single or multiple lines. */
|
|
typedef NS_ENUM(NSUInteger, ASStackLayoutFlexWrap) {
|
|
ASStackLayoutFlexWrapNoWrap,
|
|
ASStackLayoutFlexWrapWrap,
|
|
};
|
|
|
|
/** Orientation of lines along cross axis if there are multiple lines. */
|
|
typedef NS_ENUM(NSUInteger, ASStackLayoutAlignContent) {
|
|
ASStackLayoutAlignContentStart,
|
|
ASStackLayoutAlignContentCenter,
|
|
ASStackLayoutAlignContentEnd,
|
|
ASStackLayoutAlignContentSpaceBetween,
|
|
ASStackLayoutAlignContentSpaceAround,
|
|
ASStackLayoutAlignContentStretch,
|
|
};
|
|
|
|
/** Orientation of children along horizontal axis */
|
|
typedef NS_ENUM(NSUInteger, ASHorizontalAlignment) {
|
|
/** No alignment specified. Default value */
|
|
ASHorizontalAlignmentNone,
|
|
/** Left aligned */
|
|
ASHorizontalAlignmentLeft,
|
|
/** Center aligned */
|
|
ASHorizontalAlignmentMiddle,
|
|
/** Right aligned */
|
|
ASHorizontalAlignmentRight,
|
|
|
|
// After 2.0 has landed, we'll add ASDISPLAYNODE_DEPRECATED here - for now, avoid triggering errors for projects with -Werror
|
|
/** @deprecated Use ASHorizontalAlignmentLeft instead */
|
|
ASAlignmentLeft ASDISPLAYNODE_DEPRECATED = ASHorizontalAlignmentLeft,
|
|
/** @deprecated Use ASHorizontalAlignmentMiddle instead */
|
|
ASAlignmentMiddle ASDISPLAYNODE_DEPRECATED = ASHorizontalAlignmentMiddle,
|
|
/** @deprecated Use ASHorizontalAlignmentRight instead */
|
|
ASAlignmentRight ASDISPLAYNODE_DEPRECATED = ASHorizontalAlignmentRight,
|
|
};
|
|
|
|
/** Orientation of children along vertical axis */
|
|
typedef NS_ENUM(NSUInteger, ASVerticalAlignment) {
|
|
/** No alignment specified. Default value */
|
|
ASVerticalAlignmentNone,
|
|
/** Top aligned */
|
|
ASVerticalAlignmentTop,
|
|
/** Center aligned */
|
|
ASVerticalAlignmentCenter,
|
|
/** Bottom aligned */
|
|
ASVerticalAlignmentBottom,
|
|
|
|
// After 2.0 has landed, we'll add ASDISPLAYNODE_DEPRECATED here - for now, avoid triggering errors for projects with -Werror
|
|
/** @deprecated Use ASVerticalAlignmentTop instead */
|
|
ASAlignmentTop ASDISPLAYNODE_DEPRECATED = ASVerticalAlignmentTop,
|
|
/** @deprecated Use ASVerticalAlignmentCenter instead */
|
|
ASAlignmentCenter ASDISPLAYNODE_DEPRECATED = ASVerticalAlignmentCenter,
|
|
/** @deprecated Use ASVerticalAlignmentBottom instead */
|
|
ASAlignmentBottom ASDISPLAYNODE_DEPRECATED = ASVerticalAlignmentBottom,
|
|
};
|