mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
[Layout] Improve Layout System Abstraction (#2941)
* Improve Layout Abstraction * Address naming comments - Rename ASPrimitiveTraitEnvironment to ASTraitEnvironment - Rename ASPrimitiveTraitCollectionPropagateDown to ASTraitCollectionPropagateDown - Rename progagateNewPrimitiveTraitCollection: to propagateNewTraitCollection:
This commit is contained in:
committed by
GitHub
parent
a2ff2b9900
commit
12e4e5b048
@@ -8,12 +8,134 @@
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
//
|
||||
|
||||
#import <AsyncDisplayKit/ASAvailability.h>
|
||||
|
||||
#if AS_TARGET_OS_IOS
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <AsyncDisplayKit/ASEnvironment.h>
|
||||
#import <AsyncDisplayKit/ASBaseDefines.h>
|
||||
|
||||
@class ASTraitCollection;
|
||||
@protocol ASLayoutElement;
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
ASDISPLAYNODE_EXTERN_C_BEGIN
|
||||
|
||||
#pragma mark - ASPrimitiveTraitCollection
|
||||
|
||||
typedef struct ASPrimitiveTraitCollection {
|
||||
CGFloat displayScale;
|
||||
UIUserInterfaceSizeClass horizontalSizeClass;
|
||||
UIUserInterfaceIdiom userInterfaceIdiom;
|
||||
UIUserInterfaceSizeClass verticalSizeClass;
|
||||
UIForceTouchCapability forceTouchCapability;
|
||||
|
||||
CGSize containerSize;
|
||||
} ASPrimitiveTraitCollection;
|
||||
|
||||
/**
|
||||
* Creates ASPrimitiveTraitCollection with default values.
|
||||
*/
|
||||
extern ASPrimitiveTraitCollection ASPrimitiveTraitCollectionMakeDefault();
|
||||
|
||||
/**
|
||||
* Creates a ASPrimitiveTraitCollection from a given UITraitCollection.
|
||||
*/
|
||||
extern ASPrimitiveTraitCollection ASPrimitiveTraitCollectionFromUITraitCollection(UITraitCollection *traitCollection);
|
||||
|
||||
|
||||
/**
|
||||
* Compares two ASPrimitiveTraitCollection to determine if they are the same.
|
||||
*/
|
||||
extern BOOL ASPrimitiveTraitCollectionIsEqualToASPrimitiveTraitCollection(ASPrimitiveTraitCollection lhs, ASPrimitiveTraitCollection rhs);
|
||||
|
||||
/**
|
||||
* Returns a string representation of a ASPrimitiveTraitCollection.
|
||||
*/
|
||||
extern NSString *NSStringFromASPrimitiveTraitCollection(ASPrimitiveTraitCollection traits);
|
||||
|
||||
/**
|
||||
* This function will walk the layout element hierarchy and updates the layout element trait collection for every
|
||||
* layout element within the hierarchy.
|
||||
*/
|
||||
extern void ASTraitCollectionPropagateDown(id<ASLayoutElement> root, ASPrimitiveTraitCollection traitCollection);
|
||||
|
||||
/// For backward compatibility reasons we redefine the old layout element trait collection struct name
|
||||
#define ASEnvironmentTraitCollection ASPrimitiveTraitCollection
|
||||
#define ASEnvironmentTraitCollectionMakeDefault ASPrimitiveTraitCollectionMakeDefault
|
||||
|
||||
ASDISPLAYNODE_EXTERN_C_END
|
||||
|
||||
/**
|
||||
* Abstraction on top of UITraitCollection for propagation within AsyncDisplayKit-Layout
|
||||
*/
|
||||
@protocol ASTraitEnvironment <NSObject>
|
||||
|
||||
/**
|
||||
* Returns a struct-representation of the environment's ASEnvironmentDisplayTraits. This only exists as a internal
|
||||
* convenience method. Users should access the trait collections through the NSObject based asyncTraitCollection API
|
||||
*/
|
||||
- (ASPrimitiveTraitCollection)primitiveTraitCollection;
|
||||
|
||||
/**
|
||||
* Sets a trait collection on this environment state.
|
||||
*/
|
||||
- (void)setPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traitCollection;
|
||||
|
||||
/**
|
||||
* Returns an NSObject-representation of the environment's ASEnvironmentDisplayTraits
|
||||
*/
|
||||
- (ASTraitCollection *)asyncTraitCollection;
|
||||
|
||||
/**
|
||||
* Deprecated and should be replaced by the methods from above
|
||||
*/
|
||||
- (ASEnvironmentTraitCollection)environmentTraitCollection;
|
||||
- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)traitCollection;;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
#define ASPrimitiveTraitCollectionDeprecatedImplementation \
|
||||
- (ASEnvironmentTraitCollection)environmentTraitCollection\
|
||||
{\
|
||||
return self.primitiveTraitCollection;\
|
||||
}\
|
||||
- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)traitCollection\
|
||||
{\
|
||||
[self setPrimitiveTraitCollection:traitCollection];\
|
||||
}\
|
||||
|
||||
#define ASLayoutElementCollectionTableSetTraitCollection(lock) \
|
||||
- (void)setPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traitCollection\
|
||||
{\
|
||||
ASDN::MutexLocker l(lock);\
|
||||
\
|
||||
ASPrimitiveTraitCollection oldTraits = self.primitiveTraitCollection;\
|
||||
[super setPrimitiveTraitCollection:traitCollection];\
|
||||
\
|
||||
/* Extra Trait Collection Handling */\
|
||||
\
|
||||
/* If the node is not loaded yet don't do anything as otherwise the access of the view will trigger a load*/\
|
||||
if (!self.isNodeLoaded) { return; }\
|
||||
\
|
||||
ASPrimitiveTraitCollection currentTraits = self.primitiveTraitCollection;\
|
||||
if (ASPrimitiveTraitCollectionIsEqualToASPrimitiveTraitCollection(currentTraits, oldTraits) == NO) {\
|
||||
/* Must dispatch to main for self.view && [self.view.dataController completedNodes]*/\
|
||||
ASPerformBlockOnMainThread(^{\
|
||||
NSArray<NSArray <ASCellNode *> *> *completedNodes = [self.view.dataController completedNodes];\
|
||||
for (NSArray *sectionArray in completedNodes) {\
|
||||
for (ASCellNode *cellNode in sectionArray) {\
|
||||
ASTraitCollectionPropagateDown(cellNode, currentTraits);\
|
||||
}\
|
||||
}\
|
||||
});\
|
||||
}\
|
||||
}\
|
||||
|
||||
#pragma mark - ASTraitCollection
|
||||
|
||||
AS_SUBCLASSING_RESTRICTED
|
||||
@interface ASTraitCollection : NSObject
|
||||
|
||||
@@ -24,7 +146,7 @@ AS_SUBCLASSING_RESTRICTED
|
||||
@property (nonatomic, assign, readonly) UIForceTouchCapability forceTouchCapability;
|
||||
@property (nonatomic, assign, readonly) CGSize containerSize;
|
||||
|
||||
+ (ASTraitCollection *)traitCollectionWithASEnvironmentTraitCollection:(ASEnvironmentTraitCollection)traits;
|
||||
+ (ASTraitCollection *)traitCollectionWithASPrimitiveTraitCollection:(ASPrimitiveTraitCollection)traits;
|
||||
|
||||
+ (ASTraitCollection *)traitCollectionWithUITraitCollection:(UITraitCollection *)traitCollection
|
||||
containerSize:(CGSize)windowSize;
|
||||
@@ -35,12 +157,18 @@ AS_SUBCLASSING_RESTRICTED
|
||||
horizontalSizeClass:(UIUserInterfaceSizeClass)horizontalSizeClass
|
||||
verticalSizeClass:(UIUserInterfaceSizeClass)verticalSizeClass
|
||||
forceTouchCapability:(UIForceTouchCapability)forceTouchCapability
|
||||
containerSize:(CGSize)windowSize;
|
||||
containerSize:(CGSize)windowSize;
|
||||
|
||||
|
||||
- (ASEnvironmentTraitCollection)environmentTraitCollection;
|
||||
- (ASPrimitiveTraitCollection)primitiveTraitCollection;
|
||||
- (BOOL)isEqualToTraitCollection:(ASTraitCollection *)traitCollection;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#else
|
||||
|
||||
// Non iOS
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user