From 7dd2fbfad1b422a46c796842b2f7d0f7c074fe82 Mon Sep 17 00:00:00 2001 From: Michael Schneider Date: Wed, 24 Feb 2016 20:18:20 -0800 Subject: [PATCH] Overall improvements for the SocialAppLayout example --- .../SocialAppLayout/Sample/CommentsNode.h | 9 +- .../SocialAppLayout/Sample/CommentsNode.m | 33 ++--- examples/SocialAppLayout/Sample/LikesNode.h | 12 +- examples/SocialAppLayout/Sample/LikesNode.m | 36 +++--- examples/SocialAppLayout/Sample/Post.h | 12 +- examples/SocialAppLayout/Sample/PostNode.h | 22 +--- examples/SocialAppLayout/Sample/PostNode.m | 120 ++++++++---------- examples/SocialAppLayout/Sample/TextStyles.m | 42 +++--- .../SocialAppLayout/Sample/ViewController.m | 66 +++++----- 9 files changed, 148 insertions(+), 204 deletions(-) diff --git a/examples/SocialAppLayout/Sample/CommentsNode.h b/examples/SocialAppLayout/Sample/CommentsNode.h index 5deafb5743..254f6abe2b 100644 --- a/examples/SocialAppLayout/Sample/CommentsNode.h +++ b/examples/SocialAppLayout/Sample/CommentsNode.h @@ -11,14 +11,7 @@ #import -@interface CommentsNode : ASControlNode { - - ASImageNode *_iconNode; - ASTextNode *_countNode; - - NSInteger _comentsCount; - -} +@interface CommentsNode : ASControlNode - (instancetype)initWithCommentsCount:(NSInteger)comentsCount; diff --git a/examples/SocialAppLayout/Sample/CommentsNode.m b/examples/SocialAppLayout/Sample/CommentsNode.m index 97bcc37191..c2f33d1219 100644 --- a/examples/SocialAppLayout/Sample/CommentsNode.m +++ b/examples/SocialAppLayout/Sample/CommentsNode.m @@ -12,32 +12,32 @@ #import "CommentsNode.h" #import "TextStyles.h" +@interface CommentsNode () +@property (nonatomic, strong) ASImageNode *iconNode; +@property (nonatomic, strong) ASTextNode *countNode; +@property (nonatomic, assign) NSInteger commentsCount; +@end + @implementation CommentsNode - (instancetype)initWithCommentsCount:(NSInteger)comentsCount { self = [super init]; - - if(self) { - - _comentsCount = comentsCount; + if (self) { + _commentsCount = comentsCount; _iconNode = [[ASImageNode alloc] init]; _iconNode.image = [UIImage imageNamed:@"icon_comment.png"]; [self addSubnode:_iconNode]; _countNode = [[ASTextNode alloc] init]; - if(_comentsCount > 0) { - - _countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_comentsCount] attributes:[TextStyles cellControlStyle]]; - + if (_commentsCount > 0) { + _countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%zd", _commentsCount] attributes:[TextStyles cellControlStyle]]; } - [self addSubnode:_countNode]; // make it tappable easily self.hitTestSlop = UIEdgeInsetsMake(-10, -10, -10, -10); - } return self; @@ -46,18 +46,13 @@ - (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize { - ASStackLayoutSpec *mainStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:6.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_iconNode, _countNode]]; + ASStackLayoutSpec *mainStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:6.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[self.iconNode, self.countNode]]; // set sizeRange to make width fixed to 60 - mainStack.sizeRange = ASRelativeSizeRangeMake(ASRelativeSizeMake( - ASRelativeDimensionMakeWithPoints(60.0), - ASRelativeDimensionMakeWithPoints(0.0) - ), ASRelativeSizeMake( - ASRelativeDimensionMakeWithPoints(60.0), - ASRelativeDimensionMakeWithPoints(40.0) - )); + ASRelativeSize min = ASRelativeSizeMake(ASRelativeDimensionMakeWithPoints(60.0), ASRelativeDimensionMakeWithPoints(0.0)); + ASRelativeSize max = ASRelativeSizeMake(ASRelativeDimensionMakeWithPoints(60.0), ASRelativeDimensionMakeWithPoints(40.0)); + mainStack.sizeRange = ASRelativeSizeRangeMake(min,max); return [ASStaticLayoutSpec staticLayoutSpecWithChildren:@[mainStack]]; - } diff --git a/examples/SocialAppLayout/Sample/LikesNode.h b/examples/SocialAppLayout/Sample/LikesNode.h index eb7d778a6c..d294459bc5 100644 --- a/examples/SocialAppLayout/Sample/LikesNode.h +++ b/examples/SocialAppLayout/Sample/LikesNode.h @@ -11,18 +11,8 @@ #import -@interface LikesNode : ASControlNode { - - ASImageNode *_iconNode; - ASTextNode *_countNode; - - NSInteger _likesCount; - BOOL _liked; - -} +@interface LikesNode : ASControlNode - (instancetype)initWithLikesCount:(NSInteger)likesCount; -+ (BOOL) getYesOrNo; - @end diff --git a/examples/SocialAppLayout/Sample/LikesNode.m b/examples/SocialAppLayout/Sample/LikesNode.m index 824fa43a6a..b650398338 100644 --- a/examples/SocialAppLayout/Sample/LikesNode.m +++ b/examples/SocialAppLayout/Sample/LikesNode.m @@ -12,14 +12,19 @@ #import "LikesNode.h" #import "TextStyles.h" -@implementation LikesNode +@interface LikesNode () +@property (nonatomic, strong) ASImageNode *iconNode; +@property (nonatomic, strong) ASTextNode *countNode; +@property (nonatomic, assign) NSInteger likesCount; +@property (nonatomic, assign) BOOL liked; +@end + +@implementation LikesNode - (instancetype)initWithLikesCount:(NSInteger)likesCount { self = [super init]; - - if(self) { - + if (self) { _likesCount = likesCount; _liked = (_likesCount > 0) ? [LikesNode getYesOrNo] : NO; @@ -28,16 +33,12 @@ [self addSubnode:_iconNode]; _countNode = [[ASTextNode alloc] init]; - if(_likesCount > 0) { + if (_likesCount > 0) { - if(_liked) { - _countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_likesCount] attributes:[TextStyles cellControlColoredStyle]]; - }else { - _countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_likesCount] attributes:[TextStyles cellControlStyle]]; - } + NSDictionary *attributes = _liked ? [TextStyles cellControlColoredStyle] : [TextStyles cellControlStyle]; + _countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_likesCount] attributes:attributes]; } - [self addSubnode:_countNode]; // make it tappable easily @@ -51,8 +52,9 @@ + (BOOL) getYesOrNo { int tmp = (arc4random() % 30)+1; - if(tmp % 5 == 0) + if (tmp % 5 == 0) { return YES; + } return NO; } @@ -61,13 +63,9 @@ ASStackLayoutSpec *mainStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:6.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_iconNode, _countNode]]; // set sizeRange to make width fixed to 60 - mainStack.sizeRange = ASRelativeSizeRangeMake(ASRelativeSizeMake( - ASRelativeDimensionMakeWithPoints(60.0), - ASRelativeDimensionMakeWithPoints(0.0) - ), ASRelativeSizeMake( - ASRelativeDimensionMakeWithPoints(60.0), - ASRelativeDimensionMakeWithPoints(40.0) - )); + ASRelativeSize min = ASRelativeSizeMake(ASRelativeDimensionMakeWithPoints(60.0), ASRelativeDimensionMakeWithPoints(0.0)); + ASRelativeSize max = ASRelativeSizeMake(ASRelativeDimensionMakeWithPoints(60.0), ASRelativeDimensionMakeWithPoints(40.0)); + mainStack.sizeRange = ASRelativeSizeRangeMake(min, max); return [ASStaticLayoutSpec staticLayoutSpecWithChildren:@[mainStack]]; } diff --git a/examples/SocialAppLayout/Sample/Post.h b/examples/SocialAppLayout/Sample/Post.h index d1e7f7c0aa..58be8bad74 100644 --- a/examples/SocialAppLayout/Sample/Post.h +++ b/examples/SocialAppLayout/Sample/Post.h @@ -13,12 +13,12 @@ @interface Post : NSObject -@property (nonatomic, strong) NSString *username; -@property (nonatomic, strong) NSString *name; -@property (nonatomic, strong) NSString *photo; -@property (nonatomic, strong) NSString *post; -@property (nonatomic, strong) NSString *time; -@property (nonatomic, strong) NSString *media; +@property (nonatomic, copy) NSString *username; +@property (nonatomic, copy) NSString *name; +@property (nonatomic, copy) NSString *photo; +@property (nonatomic, copy) NSString *post; +@property (nonatomic, copy) NSString *time; +@property (nonatomic, copy) NSString *media; @property (nonatomic, assign) NSInteger via; @property (nonatomic, assign) NSInteger likes; diff --git a/examples/SocialAppLayout/Sample/PostNode.h b/examples/SocialAppLayout/Sample/PostNode.h index de3dbb80df..486c9184d8 100644 --- a/examples/SocialAppLayout/Sample/PostNode.h +++ b/examples/SocialAppLayout/Sample/PostNode.h @@ -10,28 +10,10 @@ */ #import -#import "Post.h" -@class LikesNode; -@class CommentsNode; +@class Post; -@interface PostNode : ASCellNode { - - Post *_post; - - ASDisplayNode *_divider; - ASTextNode *_nameNode; - ASTextNode *_usernameNode; - ASTextNode *_timeNode; - ASTextNode *_postNode; - ASImageNode *_viaNode; - ASNetworkImageNode *_avatarNode; - ASNetworkImageNode *_mediaNode; - LikesNode *_likesNode; - CommentsNode *_commentsNode; - ASImageNode *_optionsNode; - -} +@interface PostNode : ASCellNode - (instancetype)initWithPost:(Post *)post; diff --git a/examples/SocialAppLayout/Sample/PostNode.m b/examples/SocialAppLayout/Sample/PostNode.m index bf1c5f22b5..9d29fcd4f3 100644 --- a/examples/SocialAppLayout/Sample/PostNode.m +++ b/examples/SocialAppLayout/Sample/PostNode.m @@ -10,11 +10,26 @@ */ #import "PostNode.h" +#import "Post.h" #import "TextStyles.h" #import "LikesNode.h" #import "CommentsNode.h" -@interface PostNode() +@interface PostNode() + +@property (strong, nonatomic) Post *post; +@property (strong, nonatomic) ASDisplayNode *divider; +@property (strong, nonatomic) ASTextNode *nameNode; +@property (strong, nonatomic) ASTextNode *usernameNode; +@property (strong, nonatomic) ASTextNode *timeNode; +@property (strong, nonatomic) ASTextNode *postNode; +@property (strong, nonatomic) ASImageNode *viaNode; +@property (strong, nonatomic) ASNetworkImageNode *avatarNode; +@property (strong, nonatomic) ASNetworkImageNode *mediaNode; +@property (strong, nonatomic) LikesNode *likesNode; +@property (strong, nonatomic) CommentsNode *commentsNode; +@property (strong, nonatomic) ASImageNode *optionsNode; + @end @implementation PostNode @@ -22,41 +37,35 @@ - (instancetype)initWithPost:(Post *)post { self = [super init]; - - if(self) { - + if (self) { _post = post; - // name node + // Name node _nameNode = [[ASTextNode alloc] init]; - _nameNode.attributedString = [[NSAttributedString alloc] initWithString:_post.name - attributes:[TextStyles nameStyle]]; + _nameNode.attributedString = [[NSAttributedString alloc] initWithString:_post.name attributes:[TextStyles nameStyle]]; _nameNode.maximumNumberOfLines = 1; [self addSubnode:_nameNode]; - // username node + // Username node _usernameNode = [[ASTextNode alloc] init]; - _usernameNode.attributedString = [[NSAttributedString alloc] initWithString:_post.username - attributes:[TextStyles usernameStyle]]; + _usernameNode.attributedString = [[NSAttributedString alloc] initWithString:_post.username attributes:[TextStyles usernameStyle]]; _usernameNode.flexShrink = YES; //if name and username don't fit to cell width, allow username shrink _usernameNode.truncationMode = NSLineBreakByTruncatingTail; _usernameNode.maximumNumberOfLines = 1; - [self addSubnode:_usernameNode]; - // time node + // Time node _timeNode = [[ASTextNode alloc] init]; - _timeNode.attributedString = [[NSAttributedString alloc] initWithString:_post.time - attributes:[TextStyles timeStyle]]; + _timeNode.attributedString = [[NSAttributedString alloc] initWithString:_post.time attributes:[TextStyles timeStyle]]; [self addSubnode:_timeNode]; - // post node + // Post node _postNode = [[ASTextNode alloc] init]; - - // processing URLs in post + + // Processing URLs in post NSString *kLinkAttributeName = @"TextLinkAttributeName"; - if(![_post.post isEqualToString:@""]) { + if (![_post.post isEqualToString:@""]) { NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:_post.post attributes:[TextStyles postStyle]]; @@ -75,7 +84,7 @@ }]; - // configure node to support tappable links + // Configure node to support tappable links _postNode.delegate = self; _postNode.userInteractionEnabled = YES; _postNode.linkAttributeNames = @[ kLinkAttributeName ]; @@ -85,9 +94,9 @@ [self addSubnode:_postNode]; - // media - if(![_post.media isEqualToString:@""]) { + // Media + if (![_post.media isEqualToString:@""]) { _mediaNode = [[ASNetworkImageNode alloc] init]; _mediaNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor(); @@ -113,7 +122,7 @@ [self addSubnode:_mediaNode]; } - // user pic + // User pic _avatarNode = [[ASNetworkImageNode alloc] init]; _avatarNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor(); _avatarNode.preferredFrameSize = CGSizeMake(44, 44); @@ -137,19 +146,19 @@ }; [self addSubnode:_avatarNode]; - // hairline cell separator + // Hairline cell separator _divider = [[ASDisplayNode alloc] init]; _divider.backgroundColor = [UIColor lightGrayColor]; [self addSubnode:_divider]; - if(_post.via != 0) { - + // Via + if (_post.via != 0) { _viaNode = [[ASImageNode alloc] init]; _viaNode.image = (_post.via == 1) ? [UIImage imageNamed:@"icon_ios.png"] : [UIImage imageNamed:@"icon_android.png"]; [self addSubnode:_viaNode]; } - // bottom controls + // Bottom controls _likesNode = [[LikesNode alloc] initWithLikesCount:_post.likes]; [self addSubnode:_likesNode]; @@ -159,9 +168,7 @@ _optionsNode = [[ASImageNode alloc] init]; _optionsNode.image = [UIImage imageNamed:@"icon_more"]; [self addSubnode:_optionsNode]; - } - return self; } @@ -175,50 +182,33 @@ - (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize { - //Flexible spacer between username and time + // Flexible spacer between username and time ASLayoutSpec *spacer = [[ASLayoutSpec alloc] init]; spacer.flexGrow = YES; - //Horizontal stack for name, username, via icon and time - ASStackLayoutSpec *nameStack; - - //Cases with or without via icon - if(_post.via != 0) { - - nameStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:5.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_nameNode, _usernameNode, spacer, _viaNode, _timeNode]]; - - }else { - nameStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:5.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_nameNode, _usernameNode, spacer, _timeNode]]; + // Horizontal stack for name, username, via icon and time + NSMutableArray *layoutSpecChildren = [@[_nameNode, _usernameNode, spacer] mutableCopy]; + if (_post.via != 0) { + [layoutSpecChildren addObject:_viaNode]; } + [layoutSpecChildren addObject:_timeNode]; - + ASStackLayoutSpec *nameStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:5.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:layoutSpecChildren]; nameStack.alignSelf = ASStackLayoutAlignSelfStretch; // bottom controls horizontal stack ASStackLayoutSpec *controlsStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:10 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_likesNode, _commentsNode, _optionsNode]]; - //add more gaps for control line + // Add more gaps for control line controlsStack.spacingAfter = 3.0; controlsStack.spacingBefore = 3.0; NSMutableArray *mainStackContent = [[NSMutableArray alloc] init]; - [mainStackContent addObject:nameStack]; [mainStackContent addObject:_postNode]; - if(![_post.media isEqualToString:@""]) { - - CGFloat imageRatio; - - if(_mediaNode.image != nil) { - - imageRatio = _mediaNode.image.size.height / _mediaNode.image.size.width; - - }else { - - imageRatio = 0.5; - } - + if (![_post.media isEqualToString:@""]) { + CGFloat imageRatio = (_mediaNode.image != nil ? _mediaNode.image.size.height / _mediaNode.image.size.width : 0.5); ASRatioLayoutSpec *imagePlace = [ASRatioLayoutSpec ratioLayoutSpecWithRatio:imageRatio child:_mediaNode]; imagePlace.spacingAfter = 3.0; imagePlace.spacingBefore = 3.0; @@ -226,14 +216,17 @@ [mainStackContent addObject:imagePlace]; } - [mainStackContent addObject:controlsStack]; - //Vertical spec of cell main content + // Vertical spec of cell main content ASStackLayoutSpec *contentSpec = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionVertical spacing:8.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:mainStackContent]; + contentSpec.alignItems = ASStackLayoutAlignSelfStretch; + contentSpec.flexShrink = YES; + // Horizontal spec for avatar + ASStackLayoutSpec *avatarContentSpec = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:8.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:@[_avatarNode, contentSpec]]; - return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(10, 64, 10, 10) child:contentSpec]; + return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(10, 10, 10, 10) child:avatarContentSpec]; } @@ -244,26 +237,23 @@ // Manually layout the divider. CGFloat pixelHeight = 1.0f / [[UIScreen mainScreen] scale]; _divider.frame = CGRectMake(0.0f, 0.0f, self.calculatedSize.width, pixelHeight); - _avatarNode.frame = CGRectMake(10, 10, 44, 44); } -#pragma mark - -#pragma mark ASTextNodeDelegate methods. +#pragma mark - ASTextNodeDelegate methods. - (BOOL)textNode:(ASTextNode *)richTextNode shouldHighlightLinkAttribute:(NSString *)attribute value:(id)value atPoint:(CGPoint)point { - // opt into link highlighting -- tap and hold the link to try it! must enable highlighting on a layer, see -didLoad + // Opt into link highlighting -- tap and hold the link to try it! must enable highlighting on a layer, see -didLoad return YES; } - (void)textNode:(ASTextNode *)richTextNode tappedLinkAttribute:(NSString *)attribute value:(NSURL *)URL atPoint:(CGPoint)point textRange:(NSRange)textRange { - // the node tapped a link, open it + // The node tapped a link, open it [[UIApplication sharedApplication] openURL:URL]; } -#pragma mark - -#pragma mark ASNetworkImageNodeDelegate methods. +#pragma mark - ASNetworkImageNodeDelegate methods. - (void)imageNode:(ASNetworkImageNode *)imageNode didLoadImage:(UIImage *)image { diff --git a/examples/SocialAppLayout/Sample/TextStyles.m b/examples/SocialAppLayout/Sample/TextStyles.m index a561469fe3..153b12407e 100644 --- a/examples/SocialAppLayout/Sample/TextStyles.m +++ b/examples/SocialAppLayout/Sample/TextStyles.m @@ -16,58 +16,58 @@ + (NSDictionary *)nameStyle { return @{ - NSFontAttributeName : [UIFont boldSystemFontOfSize:15.0], - NSForegroundColorAttributeName: [UIColor blackColor] + NSFontAttributeName : [UIFont boldSystemFontOfSize:15.0], + NSForegroundColorAttributeName: [UIColor blackColor] }; } + (NSDictionary *)usernameStyle { return @{ - NSFontAttributeName : [UIFont systemFontOfSize:13.0], - NSForegroundColorAttributeName: [UIColor lightGrayColor] - }; + NSFontAttributeName : [UIFont systemFontOfSize:13.0], + NSForegroundColorAttributeName: [UIColor lightGrayColor] + }; } + (NSDictionary *)timeStyle { return @{ - NSFontAttributeName : [UIFont systemFontOfSize:13.0], - NSForegroundColorAttributeName: [UIColor grayColor] - }; + NSFontAttributeName : [UIFont systemFontOfSize:13.0], + NSForegroundColorAttributeName: [UIColor grayColor] + }; } + (NSDictionary *)postStyle { return @{ - NSFontAttributeName : [UIFont systemFontOfSize:15.0], - NSForegroundColorAttributeName: [UIColor blackColor] - }; + NSFontAttributeName : [UIFont systemFontOfSize:15.0], + NSForegroundColorAttributeName: [UIColor blackColor] + }; } + (NSDictionary *)postLinkStyle { return @{ - NSFontAttributeName : [UIFont systemFontOfSize:15.0], - NSForegroundColorAttributeName: [UIColor colorWithRed:59.0/255.0 green:89.0/255.0 blue:152.0/255.0 alpha:1.0], - NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle) - }; + NSFontAttributeName : [UIFont systemFontOfSize:15.0], + NSForegroundColorAttributeName: [UIColor colorWithRed:59.0/255.0 green:89.0/255.0 blue:152.0/255.0 alpha:1.0], + NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle) + }; } + (NSDictionary *)cellControlStyle { return @{ - NSFontAttributeName : [UIFont systemFontOfSize:13.0], - NSForegroundColorAttributeName: [UIColor lightGrayColor] - }; + NSFontAttributeName : [UIFont systemFontOfSize:13.0], + NSForegroundColorAttributeName: [UIColor lightGrayColor] + }; } + (NSDictionary *)cellControlColoredStyle { return @{ - NSFontAttributeName : [UIFont systemFontOfSize:13.0], - NSForegroundColorAttributeName: [UIColor colorWithRed:59.0/255.0 green:89.0/255.0 blue:152.0/255.0 alpha:1.0] - }; + NSFontAttributeName : [UIFont systemFontOfSize:13.0], + NSForegroundColorAttributeName: [UIColor colorWithRed:59.0/255.0 green:89.0/255.0 blue:152.0/255.0 alpha:1.0] + }; } @end diff --git a/examples/SocialAppLayout/Sample/ViewController.m b/examples/SocialAppLayout/Sample/ViewController.m index ff6abbd3f8..36010f0bd7 100644 --- a/examples/SocialAppLayout/Sample/ViewController.m +++ b/examples/SocialAppLayout/Sample/ViewController.m @@ -15,46 +15,46 @@ #import #import + #include @interface ViewController () -{ - ASTableView *_tableView; - - NSMutableArray *_socialAppDataSource; -} +@property (nonatomic, strong) ASTableView *tableView; +@property (nonatomic, strong) NSMutableArray *socialAppDataSource; @end + @implementation ViewController - (instancetype)init { - if (!(self = [super init])) - return nil; - - _tableView = [[ASTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain asyncDataFetching:YES]; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // SocialAppNode has its own separator - _tableView.asyncDataSource = self; - _tableView.asyncDelegate = self; - - [self createSocialAppDataSource]; - - self.title = @"Timeline"; - + self = [super init]; + if (self) { + self.title = @"Timeline"; + [self createSocialAppDataSource]; + } return self; } + +- (void)dealloc +{ + _tableView.asyncDataSource = nil; + _tableView.asyncDelegate = nil; +} + - (void)viewDidLoad { [super viewDidLoad]; - [self.view addSubview:_tableView]; -} - -- (void)viewWillLayoutSubviews -{ - _tableView.frame = self.view.bounds; + + self.tableView = [[ASTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain asyncDataFetching:YES]; + self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // SocialAppNode has its own separator + self.tableView.asyncDataSource = self; + self.tableView.asyncDelegate = self; + [self.view addSubview:self.tableView]; } - (BOOL)prefersStatusBarHidden @@ -76,7 +76,6 @@ newPost.via = 0; newPost.likes = arc4random_uniform(74); newPost.comments = arc4random_uniform(40); - [_socialAppDataSource addObject:newPost]; newPost = [[Post alloc] init]; @@ -89,7 +88,6 @@ newPost.via = 1; newPost.likes = arc4random_uniform(74); newPost.comments = arc4random_uniform(40); - [_socialAppDataSource addObject:newPost]; newPost = [[Post alloc] init]; @@ -102,7 +100,6 @@ newPost.via = 2; newPost.likes = arc4random_uniform(74); newPost.comments = arc4random_uniform(40); - [_socialAppDataSource addObject:newPost]; newPost = [[Post alloc] init]; @@ -115,29 +112,28 @@ newPost.via = 1; newPost.likes = arc4random_uniform(74); newPost.comments = arc4random_uniform(40); - [_socialAppDataSource addObject:newPost]; } -#pragma mark - -#pragma mark ASTableView. +#pragma mark - ASTableView -- (ASCellNode *)tableView:(ASTableView *)tableView nodeForRowAtIndexPath:(NSIndexPath *)indexPath +- (ASCellNodeBlock)tableView:(ASTableView *)tableView nodeBlockForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { - Post *post = _socialAppDataSource[indexPath.row]; - PostNode *node = [[PostNode alloc] initWithPost:post]; - return node; + Post *post = self.socialAppDataSource[indexPath.row]; + return ^{ + return [[PostNode alloc] initWithPost:post]; + }; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return _socialAppDataSource.count; + return self.socialAppDataSource.count; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { PostNode *postNode = (PostNode *)[_tableView nodeForRowAtIndexPath:indexPath]; - Post *post = _socialAppDataSource[indexPath.row]; + Post *post = self.socialAppDataSource[indexPath.row]; BOOL shouldRasterize = postNode.shouldRasterizeDescendants; shouldRasterize = !shouldRasterize;