mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-14 16:08:51 +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
113 lines
3.7 KiB
Objective-C
113 lines
3.7 KiB
Objective-C
//
|
||
// ASElementMap.h
|
||
// AsyncDisplayKit
|
||
//
|
||
// Created by Adlai Holler on 2/22/17.
|
||
// Copyright © 2017 Facebook. All rights reserved.
|
||
//
|
||
|
||
#import <Foundation/Foundation.h>
|
||
#import <AsyncDisplayKit/ASBaseDefines.h>
|
||
|
||
NS_ASSUME_NONNULL_BEGIN
|
||
|
||
@class ASCollectionElement, ASSection, UICollectionViewLayoutAttributes;
|
||
@protocol ASSectionContext;
|
||
|
||
/**
|
||
* An immutable representation of the state of a collection view's data.
|
||
* All items and supplementary elements are represented by ASCollectionElement.
|
||
* Fast enumeration is in terms of ASCollectionElement.
|
||
*/
|
||
AS_SUBCLASSING_RESTRICTED
|
||
@interface ASElementMap : NSObject <NSCopying, NSFastEnumeration>
|
||
|
||
/**
|
||
* The number of sections (of items) in this map.
|
||
*/
|
||
@property (readonly) NSInteger numberOfSections;
|
||
|
||
/**
|
||
* The kinds of supplementary elements present in this map. O(1)
|
||
*/
|
||
@property (copy, readonly) NSArray<NSString *> *supplementaryElementKinds;
|
||
|
||
/**
|
||
* Returns number of items in the given section. O(1)
|
||
*/
|
||
- (NSInteger)numberOfItemsInSection:(NSInteger)section;
|
||
|
||
/**
|
||
* Returns the context object for the given section, if any. O(1)
|
||
*/
|
||
- (nullable id<ASSectionContext>)contextForSection:(NSInteger)section;
|
||
|
||
/**
|
||
* All the index paths for all the items in this map. O(N)
|
||
*
|
||
* This property may be removed in the future, since it doesn't account for supplementary nodes.
|
||
*/
|
||
@property (copy, readonly) NSArray<NSIndexPath *> *itemIndexPaths;
|
||
|
||
/**
|
||
* All the item elements in this map, in ascending order. O(N)
|
||
*/
|
||
@property (copy, readonly) NSArray<ASCollectionElement *> *itemElements;
|
||
|
||
/**
|
||
* Returns the index path that corresponds to the same element in @c map at the given @c indexPath. O(1)
|
||
*/
|
||
- (nullable NSIndexPath *)convertIndexPath:(NSIndexPath *)indexPath fromMap:(ASElementMap *)map;
|
||
|
||
/**
|
||
* Returns the index path for the given element. O(1)
|
||
*/
|
||
- (nullable NSIndexPath *)indexPathForElement:(ASCollectionElement *)element;
|
||
|
||
/**
|
||
* Returns the index path for the given element, if it represents a cell. O(1)
|
||
*/
|
||
- (nullable NSIndexPath *)indexPathForElementIfCell:(ASCollectionElement *)element;
|
||
|
||
/**
|
||
* Returns the item-element at the given index path. O(1)
|
||
*/
|
||
- (nullable ASCollectionElement *)elementForItemAtIndexPath:(NSIndexPath *)indexPath;
|
||
|
||
/**
|
||
* Returns the element for the supplementary element of the given kind at the given index path. O(1)
|
||
*/
|
||
- (nullable ASCollectionElement *)supplementaryElementOfKind:(NSString *)supplementaryElementKind atIndexPath:(NSIndexPath *)indexPath;
|
||
|
||
/**
|
||
* Returns the element that corresponds to the given layout attributes, if any.
|
||
*
|
||
* NOTE: This method only regards the category, kind, and index path of the attributes object. Elements do not
|
||
* have any concept of size/position.
|
||
*/
|
||
- (nullable ASCollectionElement *)elementForLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes;
|
||
|
||
#pragma mark - Initialization -- Only Useful to ASDataController
|
||
|
||
|
||
// SectionIndex -> ItemIndex -> Element
|
||
typedef NSArray<NSArray<ASCollectionElement *> *> ASCollectionElementTwoDimensionalArray;
|
||
|
||
// ElementKind -> IndexPath -> Element
|
||
typedef NSDictionary<NSString *, NSDictionary<NSIndexPath *, ASCollectionElement *> *> ASSupplementaryElementDictionary;
|
||
|
||
/**
|
||
* Create a new element map for this dataset. You probably don't need to use this – ASDataController is the only one who creates these.
|
||
*
|
||
* @param sections The array of ASSection objects.
|
||
* @param items A 2D array of ASCollectionElements, for each item.
|
||
* @param supplementaryElements A dictionary of gathered supplementary elements.
|
||
*/
|
||
- (instancetype)initWithSections:(NSArray<ASSection *> *)sections
|
||
items:(ASCollectionElementTwoDimensionalArray *)items
|
||
supplementaryElements:(ASSupplementaryElementDictionary *)supplementaryElements;
|
||
|
||
@end
|
||
|
||
NS_ASSUME_NONNULL_END
|