mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-01 18:33:10 +00:00
- Introduce ASLayoutNode and its subclasses. - ASDisplayNode measures its ASLayoutNode and cache the result (ASLayout). Calculated size and position of each subnode can be retrieved from the calculated layout. - Custom nodes need to override -layoutNodeThatFits:(CGSize) instead of -calculateSizeThatFits:(CGSize). - Custom nodes do not need to layout its subnodes (in -layout:) anymore. ASDisplayNode can handle the job most of the time, by walking through its layout tree. - ASCompositeNode is used to embed (display) subnodes to a node's layout. That way, each subnode will also be measured while the parent node is measuring. And the parent node knows where its subnodes are within its layout.
130 lines
3.5 KiB
Plaintext
130 lines
3.5 KiB
Plaintext
/* 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 "ASCellNode.h"
|
|
|
|
#import <AsyncDisplayKit/_ASDisplayView.h>
|
|
#import <AsyncDisplayKit/ASDisplayNode+Subclasses.h>
|
|
#import <AsyncDisplayKit/ASTextNode.h>
|
|
|
|
#import "ASInsetLayoutNode.h"
|
|
#import "ASCompositeNode.h"
|
|
|
|
#pragma mark -
|
|
#pragma mark ASCellNode
|
|
|
|
@implementation ASCellNode
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (!(self = [super init]))
|
|
return nil;
|
|
|
|
// use UITableViewCell defaults
|
|
_selectionStyle = UITableViewCellSelectionStyleDefault;
|
|
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock
|
|
{
|
|
ASDisplayNodeAssertNotSupported();
|
|
return nil;
|
|
}
|
|
|
|
- (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock
|
|
{
|
|
ASDisplayNodeAssertNotSupported();
|
|
return nil;
|
|
}
|
|
|
|
- (void)setLayerBacked:(BOOL)layerBacked
|
|
{
|
|
// ASRangeController expects ASCellNodes to be view-backed. (Layer-backing is supported on ASCellNode subnodes.)
|
|
ASDisplayNodeAssert(!layerBacked, @"ASCellNode does not support layer-backing.");
|
|
}
|
|
|
|
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView");
|
|
[(_ASDisplayView *)self.view __forwardTouchesBegan:touches withEvent:event];
|
|
}
|
|
|
|
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView");
|
|
[(_ASDisplayView *)self.view __forwardTouchesMoved:touches withEvent:event];
|
|
}
|
|
|
|
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView");
|
|
[(_ASDisplayView *)self.view __forwardTouchesEnded:touches withEvent:event];
|
|
}
|
|
|
|
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
|
|
{
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView");
|
|
[(_ASDisplayView *)self.view __forwardTouchesCancelled:touches withEvent:event];
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark ASTextCellNode
|
|
|
|
@interface ASTextCellNode () {
|
|
NSString *_text;
|
|
ASTextNode *_textNode;
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation ASTextCellNode
|
|
|
|
static const CGFloat kFontSize = 18.0f;
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (!(self = [super init]))
|
|
return nil;
|
|
|
|
_textNode = [[ASTextNode alloc] init];
|
|
[self addSubnode:_textNode];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (ASLayoutNode *)layoutNodeThatFits:(CGSize)constrainedSize
|
|
{
|
|
static const CGFloat kHorizontalPadding = 15.0f;
|
|
static const CGFloat kVerticalPadding = 11.0f;
|
|
UIEdgeInsets insets = UIEdgeInsetsMake(kVerticalPadding, kHorizontalPadding, kVerticalPadding, kHorizontalPadding);
|
|
return [ASInsetLayoutNode newWithInsets:insets node:[ASCompositeNode newWithDisplayNode:_textNode]];
|
|
}
|
|
|
|
- (void)setText:(NSString *)text
|
|
{
|
|
if (_text == text)
|
|
return;
|
|
|
|
_text = [text copy];
|
|
_textNode.attributedString = [[NSAttributedString alloc] initWithString:_text
|
|
attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:kFontSize]}];
|
|
|
|
[self invalidateCalculatedLayout];
|
|
}
|
|
|
|
@end
|