Swiftgram/AsyncDisplayKit/ASCellNode.m
Nadine Salter a3e78d1cee Support background colour and selection style on ASCellNodes.
Most UITableViewCell properties aren't useful in conjunction with
ASCellNode -- the system's UIView properties are unsupported for
performance reasons, and properties that configure them (e.g., content
indentation) don't affect custom node hierarchies.  This patch adds
support to _ASTableViewCell for the properties that *are* useful.

r=scottg
2014-11-03 17:45:40 -08:00

113 lines
2.5 KiB
Objective-C

/* 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 "ASDisplayNode+Subclasses.h"
#import "ASRangeControllerInternal.h"
#import "ASTextNode.h"
#pragma mark -
#pragma mark ASCellNode
@interface ASCellNode () {
// used by ASRangeController machinery
NSIndexPath *_asyncdisplaykit_indexPath;
}
@end
@implementation ASCellNode
- (instancetype)init
{
if (!(self = [super init]))
return nil;
// use UITableViewCell defaults
_selectionStyle = UITableViewCellSelectionStyleDefault;
return self;
}
// TODO consider making this property an associated object in ASRangeController.mm
- (NSIndexPath *)asyncdisplaykit_indexPath
{
return _asyncdisplaykit_indexPath;
}
- (void)setAsyncdisplaykit_indexPath:(NSIndexPath *)asyncdisplaykit_indexPath
{
if (_asyncdisplaykit_indexPath == asyncdisplaykit_indexPath)
return;
_asyncdisplaykit_indexPath = [asyncdisplaykit_indexPath copy];
}
@end
#pragma mark -
#pragma mark ASTextCellNode
@interface ASTextCellNode () {
NSString *_text;
ASTextNode *_textNode;
}
@end
@implementation ASTextCellNode
static const CGFloat kHorizontalPadding = 15.0f;
static const CGFloat kVerticalPadding = 11.0f;
static const CGFloat kFontSize = 18.0f;
- (instancetype)init
{
if (!(self = [super init]))
return nil;
_textNode = [[ASTextNode alloc] init];
[self addSubnode:_textNode];
return self;
}
- (CGSize)calculateSizeThatFits:(CGSize)constrainedSize
{
CGSize availableSize = CGSizeMake(constrainedSize.width - 2 * kHorizontalPadding,
constrainedSize.height - 2 * kVerticalPadding);
CGSize textNodeSize = [_textNode measure:availableSize];
return CGSizeMake(ceilf(2 * kHorizontalPadding + textNodeSize.width),
ceilf(2 * kVerticalPadding + textNodeSize.height));
}
- (void)layout
{
_textNode.frame = CGRectInset(self.bounds, kHorizontalPadding, kVerticalPadding);
}
- (void)setText:(NSString *)text
{
if (_text == text)
return;
_text = [text copy];
_textNode.attributedString = [[NSAttributedString alloc] initWithString:_text
attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:kFontSize]}];
[self invalidateCalculatedSize];
}
@end