mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-06 04:32:06 +00:00
Implement sizeToFit:
This commit is contained in:
parent
f81c7a05b6
commit
c819d716b4
@ -269,6 +269,7 @@ extern NSInteger const ASDefaultDrawingPriority;
|
|||||||
|
|
||||||
@property (nonatomic, readwrite, weak, nullable) id<ASDisplayNodeSizingDelegate> sizingDelegate;
|
@property (nonatomic, readwrite, weak, nullable) id<ASDisplayNodeSizingDelegate> sizingDelegate;
|
||||||
- (void)invalidateSize;
|
- (void)invalidateSize;
|
||||||
|
- (void)sizeToFit;
|
||||||
|
|
||||||
- (CGSize)sizeThatFits:(CGSize)size;
|
- (CGSize)sizeThatFits:(CGSize)size;
|
||||||
|
|
||||||
|
@ -730,6 +730,36 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
|
|||||||
__instanceLock__.unlock();
|
__instanceLock__.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)sizeToFit
|
||||||
|
{
|
||||||
|
ASDisplayNodeAssertThreadAffinity(self);
|
||||||
|
|
||||||
|
__instanceLock__.lock();
|
||||||
|
|
||||||
|
[self setNeedsLayout];
|
||||||
|
|
||||||
|
CGSize maxSize = _supernode ? _supernode.bounds.size : CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX);
|
||||||
|
CGSize size = [self sizeThatFits:maxSize];
|
||||||
|
|
||||||
|
CGRect oldBounds = self.bounds;
|
||||||
|
CGSize oldSize = oldBounds.size;
|
||||||
|
CGSize newSize = _calculatedDisplayNodeLayout->layout.size;
|
||||||
|
|
||||||
|
if (! CGSizeEqualToSize(oldSize, newSize)) {
|
||||||
|
self.bounds = (CGRect){ oldBounds.origin, newSize };
|
||||||
|
|
||||||
|
// Frame's origin must be preserved. Since it is computed from bounds size, anchorPoint
|
||||||
|
// and position (see frame setter in ASDisplayNode+UIViewBridge), position needs to be adjusted.
|
||||||
|
CGPoint anchorPoint = self.anchorPoint;
|
||||||
|
CGPoint oldPosition = self.position;
|
||||||
|
CGFloat xDelta = (newSize.width - oldSize.width) * anchorPoint.x;
|
||||||
|
CGFloat yDelta = (newSize.height - oldSize.height) * anchorPoint.y;
|
||||||
|
self.position = CGPointMake(oldPosition.x + xDelta, oldPosition.y + yDelta);
|
||||||
|
}
|
||||||
|
|
||||||
|
__instanceLock__.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
- (CGSize)sizeThatFits:(CGSize)size
|
- (CGSize)sizeThatFits:(CGSize)size
|
||||||
{
|
{
|
||||||
return [self layoutThatFits:ASSizeRangeMake(CGSizeZero, size)].size;
|
return [self layoutThatFits:ASSizeRangeMake(CGSizeZero, size)].size;
|
||||||
|
@ -74,7 +74,6 @@
|
|||||||
// Initial size of sizing node
|
// Initial size of sizing node
|
||||||
//self.sizingNode.frame = CGRectMake(100, 100, 50, 50);
|
//self.sizingNode.frame = CGRectMake(100, 100, 50, 50);
|
||||||
|
|
||||||
self.buttonNode.frame = CGRectMake(100, 100, 200, 10);
|
|
||||||
[self displayNodeDidInvalidateSize:self.buttonNode];
|
[self displayNodeDidInvalidateSize:self.buttonNode];
|
||||||
|
|
||||||
// Initial size for image node
|
// Initial size for image node
|
||||||
@ -95,19 +94,32 @@
|
|||||||
{
|
{
|
||||||
[super viewDidLayoutSubviews];
|
[super viewDidLayoutSubviews];
|
||||||
|
|
||||||
|
[self updateButtonNodeLayout];
|
||||||
|
|
||||||
// Update the sizing node layout
|
// Update the sizing node layout
|
||||||
[self updateNodeLayout];
|
[self updateNodeLayout];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Update the node based on the new size
|
#pragma mark - Update the node based on the new size
|
||||||
|
|
||||||
|
- (void)updateButtonNodeLayout
|
||||||
|
{
|
||||||
|
[self.buttonNode sizeToFit];
|
||||||
|
self.buttonNode.frame = CGRectMake((self.view.bounds.size.width - self.buttonNode.bounds.size.width) / 2.0,
|
||||||
|
100,
|
||||||
|
self.buttonNode.bounds.size.width,
|
||||||
|
self.buttonNode.bounds.size.height);
|
||||||
|
|
||||||
|
//CGSize s = [self.buttonNode sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];
|
||||||
|
//self.buttonNode.frame = CGRectMake(100, 100, s.width, s.height);
|
||||||
|
}
|
||||||
|
|
||||||
// The sizing delegate will get callbacks if the size did invalidate of the display node. It's the job of the delegate
|
// The sizing delegate will get callbacks if the size did invalidate of the display node. It's the job of the delegate
|
||||||
// to get the new size from the display node and update the frame based on the returned size
|
// to get the new size from the display node and update the frame based on the returned size
|
||||||
- (void)displayNodeDidInvalidateSize:(ASDisplayNode *)displayNode
|
- (void)displayNodeDidInvalidateSize:(ASDisplayNode *)displayNode
|
||||||
{
|
{
|
||||||
if (displayNode == self.buttonNode) {
|
if (displayNode == self.buttonNode) {
|
||||||
CGSize s = [self.buttonNode sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];
|
[self updateButtonNodeLayout];
|
||||||
self.buttonNode.frame = CGRectMake(100, 100, s.width, s.height);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user