mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Add support for multiple children to ASWrapperLayoutSpec (#2469)
This commit is contained in:
committed by
GitHub
parent
97e23776e4
commit
4e580b96dc
@@ -63,19 +63,31 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An ASLayoutSpec subclass that can wrap a ASLayoutElement and calculates the layout of the child.
|
* An ASLayoutSpec subclass that can wrap one or more ASLayoutElement and calculates the layout based on the
|
||||||
|
* sizes of the children. If multiple children are provided the size of the biggest child will be used to for
|
||||||
|
* size of this layout spec.
|
||||||
*/
|
*/
|
||||||
@interface ASWrapperLayoutSpec : ASLayoutSpec
|
@interface ASWrapperLayoutSpec : ASLayoutSpec
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns an ASWrapperLayoutSpec object with the given layoutElement as child
|
* Returns an ASWrapperLayoutSpec object with the given layoutElement as child.
|
||||||
*/
|
*/
|
||||||
+ (instancetype)wrapperWithLayoutElement:(id<ASLayoutElement>)layoutElement AS_WARN_UNUSED_RESULT;
|
+ (instancetype)wrapperWithLayoutElement:(id<ASLayoutElement>)layoutElement AS_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns an ASWrapperLayoutSpec object initialized with the given layoutElement as child
|
* Returns an ASWrapperLayoutSpec object with the given layoutElements as children.
|
||||||
*/
|
*/
|
||||||
- (instancetype)initWithLayoutElement:(id<ASLayoutElement>)layoutElement NS_DESIGNATED_INITIALIZER;
|
+ (instancetype)wrapperWithLayoutElements:(NSArray<id<ASLayoutElement>> *)layoutElements AS_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns an ASWrapperLayoutSpec object initialized with the given layoutElement as child.
|
||||||
|
*/
|
||||||
|
- (instancetype)initWithLayoutElement:(id<ASLayoutElement>)layoutElement AS_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns an ASWrapperLayoutSpec object initialized with the given layoutElements as children.
|
||||||
|
*/
|
||||||
|
- (instancetype)initWithLayoutElements:(NSArray<id<ASLayoutElement>> *)layoutElements AS_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init not available for ASWrapperLayoutSpec
|
* Init not available for ASWrapperLayoutSpec
|
||||||
|
|||||||
@@ -315,11 +315,36 @@ ASLayoutElementStyleForwarding
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (instancetype)wrapperWithLayoutElements:(NSArray<id<ASLayoutElement>> *)layoutElements
|
||||||
|
{
|
||||||
|
return [[self alloc] initWithLayoutElements:layoutElements];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithLayoutElements:(NSArray<id<ASLayoutElement>> *)layoutElements
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
self.children = layoutElements;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
- (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize
|
- (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize
|
||||||
{
|
{
|
||||||
ASLayout *sublayout = [self.child layoutThatFits:constrainedSize parentSize:constrainedSize.max];
|
NSArray *children = self.children;
|
||||||
sublayout.position = CGPointZero;
|
NSMutableArray *sublayouts = [NSMutableArray arrayWithCapacity:children.count];
|
||||||
return [ASLayout layoutWithLayoutElement:self size:sublayout.size sublayouts:@[sublayout]];
|
|
||||||
|
CGSize size = constrainedSize.min;
|
||||||
|
for (id<ASLayoutElement> child in children) {
|
||||||
|
ASLayout *sublayout = [child layoutThatFits:constrainedSize parentSize:constrainedSize.max];
|
||||||
|
|
||||||
|
size.width = MAX(size.width, sublayout.size.width);
|
||||||
|
size.height = MAX(size.height, sublayout.size.height);
|
||||||
|
|
||||||
|
[sublayouts addObject:sublayout];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [ASLayout layoutWithLayoutElement:self size:size sublayouts:sublayouts];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
Reference in New Issue
Block a user