From 516caf3e5b27caa1089d3ab4269626d4b2b67a1c Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 14:19:37 -0800 Subject: [PATCH 01/38] Don't show like counts --- WordPress/Classes/ReaderPostTableViewCell.m | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 9d66af991933..da8dfccc04a7 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -392,14 +392,12 @@ - (void)setFeaturedImage:(UIImage *)image { - (void)updateControlBar { - if (!_post) return; + if (!_post) + return; _likeButton.selected = _post.isLiked.boolValue; _reblogButton.selected = _post.isReblogged.boolValue; _reblogButton.userInteractionEnabled = !_reblogButton.selected; - - NSString *str = ([self.post.likeCount integerValue] > 0) ? [self.post.likeCount stringValue] : nil; - [_likeButton setTitle:str forState:UIControlStateNormal]; } From 753b8a663970eb7a8bc396adbaf25daec1ba4408 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 14:22:35 -0800 Subject: [PATCH 02/38] Small code style changes --- WordPress/Classes/ReaderPostTableViewCell.m | 26 ++++++--------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index da8dfccc04a7..fc7754e5a00b 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -67,7 +67,7 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { } // Are we showing an image? What size should it be? - if(post.featuredImageURL) { + if (post.featuredImageURL) { CGFloat height = ceilf((contentWidth * 0.66f)); desiredHeight += height; } @@ -147,11 +147,9 @@ - (void)setHighlightedEffect:(BOOL)highlighted animated:(BOOL)animated { } completion:nil]; } - - (void)setPost:(ReaderPost *)post { - if ([post isEqual:_post]) { + if ([post isEqual:_post]) return; - } if (_post) { [_post removeObserver:self forKeyPath:@"isReblogged" context:@"reblogging"]; @@ -161,14 +159,12 @@ - (void)setPost:(ReaderPost *)post { [_post addObserver:self forKeyPath:@"isReblogged" options:NSKeyValueObservingOptionNew context:@"reblogging"]; } - - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { BOOL previouslyHighlighted = self.highlighted; [super setHighlighted:highlighted animated:animated]; - if (previouslyHighlighted == highlighted) { + if (previouslyHighlighted == highlighted) return; - } if (highlighted) { [self setHighlightedEffect:highlighted animated:animated]; @@ -186,7 +182,6 @@ - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [self setHighlightedEffect:selected animated:animated]; } - - (void)buildPostContent { self.cellImageView.contentMode = UIViewContentModeScaleAspectFill; [_containerView addSubview:self.cellImageView]; @@ -252,7 +247,6 @@ - (void)buildMetaContent { [_reblogButton setImage:[UIImage imageNamed:@"reader-postaction-reblog-blue"] forState:UIControlStateNormal]; [_reblogButton setImage:[UIImage imageNamed:@"reader-postaction-reblog-done"] forState:UIControlStateSelected]; [_metaView addSubview:_reblogButton]; - } - (void)layoutSubviews { @@ -269,7 +263,7 @@ - (void)layoutSubviews { _containerView.frame = frame; // Are we showing an image? What size should it be? - if(_showImage) { + if (_showImage) { height = ceilf(contentWidth * 0.66f); self.cellImageView.frame = CGRectMake(RPTVCHorizontalPadding, nextY, innerContentWidth, height); nextY += height; @@ -320,14 +314,11 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N [self updateControlBar]; } - - (void)setReblogTarget:(id)target action:(SEL)selector { [_reblogButton addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; } - - (void)configureCell:(ReaderPost *)post { - self.post = post; // This will show the placeholder avatar. Do this here instead of prepareForReusue @@ -362,16 +353,16 @@ - (void)configureCell:(ReaderPost *)post { [self updateControlBar]; } - - (void)setAvatar:(UIImage *)avatar { - if (_avatarIsSet) { + if (_avatarIsSet) return; - } + static UIImage *wpcomBlavatar; static UIImage *wporgBlavatar; if (!wpcomBlavatar) { wpcomBlavatar = [UIImage imageNamed:@"wpcom_blavatar"]; } + if (!wporgBlavatar) { wporgBlavatar = [UIImage imageNamed:@"wporg_blavatar"]; } @@ -384,13 +375,11 @@ - (void)setAvatar:(UIImage *)avatar { } } - - (void)setFeaturedImage:(UIImage *)image { self.cellImageView.contentMode = UIViewContentModeScaleAspectFill; self.cellImageView.image = image; } - - (void)updateControlBar { if (!_post) return; @@ -400,7 +389,6 @@ - (void)updateControlBar { _reblogButton.userInteractionEnabled = !_reblogButton.selected; } - - (void)handleLikeButtonTapped:(id)sender { [self.post toggleLikedWithSuccess:^{ From 98b2b59217b6d7d4bd73e9587d1f25d656731caa Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 14:33:02 -0800 Subject: [PATCH 03/38] Consts for control bar magic numbers --- WordPress/Classes/ReaderPostTableViewCell.m | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index fc7754e5a00b..bb77dd6a4d92 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -22,6 +22,12 @@ const CGFloat RPTVCMetaViewHeightWithButtons = 101.0f; const CGFloat RPTVCMetaViewHeightSansButtons = 52.0f; +// Control buttons (Like, Reblog, ...) +const NSUInteger RPTVCControlButtonCount = 2; +const CGFloat RPTVCControlButtonHeight = 48.0f; +const CGFloat RPTVCControlButtonVerticalPadding = 4.0f; +const CGFloat RPTVCControlButtonBorderSize = 1.0f; + @interface ReaderPostTableViewCell() @property (nonatomic, strong) ReaderPost *post; @@ -285,9 +291,11 @@ - (void)layoutSubviews { height = [self.post isWPCom] ? RPTVCMetaViewHeightWithButtons : RPTVCMetaViewHeightSansButtons; _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, height); - CGFloat w = ceilf(_metaView.frame.size.width / 2.0f); - _likeButton.frame = CGRectMake(0.0f, 53.0f, w, 48.0f); - _reblogButton.frame = CGRectMake(w + 1.0f, 53.0f, w - 1.f, 48.0f); + CGFloat buttonWidth = ceilf(_metaView.frame.size.width / RPTVCControlButtonCount); + CGFloat buttonY = RPTVCControlButtonHeight + RPTVCControlButtonVerticalPadding; + _likeButton.frame = CGRectMake(0.0f, buttonY, buttonWidth, RPTVCControlButtonHeight); + _reblogButton.frame = CGRectMake(buttonWidth + RPTVCControlButtonBorderSize, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); + _bylineLabel.frame = CGRectMake(47.0f, 8.0f, contentWidth - 57.0f, 36.0f); CGFloat sideBorderX = RPTVCHorizontalPadding - 1; // Just to the left of the container From 19fdfe32ac89dd7902d04bd88af0131afb04a245 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 15:14:21 -0800 Subject: [PATCH 04/38] Add comment button, reorder control buttons, remove borders --- WordPress/Classes/ReaderPostTableViewCell.m | 35 ++++++++++++++++----- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index bb77dd6a4d92..d238d28fc49d 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -23,10 +23,11 @@ const CGFloat RPTVCMetaViewHeightSansButtons = 52.0f; // Control buttons (Like, Reblog, ...) -const NSUInteger RPTVCControlButtonCount = 2; const CGFloat RPTVCControlButtonHeight = 48.0f; +const CGFloat RPTVCControlButtonWidth = 48.0f; const CGFloat RPTVCControlButtonVerticalPadding = 4.0f; -const CGFloat RPTVCControlButtonBorderSize = 1.0f; +const CGFloat RPTVCControlButtonSpacing = 12.0f; +const CGFloat RPTVCControlButtonBorderSize = 0.0f; @interface ReaderPostTableViewCell() @@ -43,6 +44,7 @@ @interface ReaderPostTableViewCell() @property (nonatomic, strong) UIView *controlView; @property (nonatomic, strong) UIButton *likeButton; @property (nonatomic, strong) UIButton *reblogButton; +@property (nonatomic, strong) UIButton *commentButton; @property (nonatomic, assign) BOOL showImage; @@ -211,11 +213,10 @@ - (void)buildPostContent { [_containerView addSubview:_snippetLabel]; } - - (void)buildMetaContent { self.metaView = [[UIView alloc] init]; _metaView.autoresizingMask = UIViewAutoresizingFlexibleWidth; - _metaView.backgroundColor = [UIColor colorWithWhite:0.95703125f alpha:1.f]; + _metaView.backgroundColor = [UIColor clearColor]; [_containerView addSubview:_metaView]; self.byView = [[UIView alloc] init]; @@ -253,6 +254,13 @@ - (void)buildMetaContent { [_reblogButton setImage:[UIImage imageNamed:@"reader-postaction-reblog-blue"] forState:UIControlStateNormal]; [_reblogButton setImage:[UIImage imageNamed:@"reader-postaction-reblog-done"] forState:UIControlStateSelected]; [_metaView addSubview:_reblogButton]; + + self.commentButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; + _commentButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin; + _commentButton.backgroundColor = [UIColor whiteColor]; + [_commentButton setImage:[UIImage imageNamed:@"reader-postaction-comment-blue"] forState:UIControlStateNormal]; + [_commentButton setImage:[UIImage imageNamed:@"reader-postaction-comment-active"] forState:UIControlStateSelected]; + [_metaView addSubview:_commentButton]; } - (void)layoutSubviews { @@ -291,10 +299,23 @@ - (void)layoutSubviews { height = [self.post isWPCom] ? RPTVCMetaViewHeightWithButtons : RPTVCMetaViewHeightSansButtons; _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, height); - CGFloat buttonWidth = ceilf(_metaView.frame.size.width / RPTVCControlButtonCount); + BOOL commentsOpen = [[self.post commentsOpen] boolValue]; + CGFloat buttonWidth = RPTVCControlButtonWidth - RPTVCControlButtonBorderSize; + CGFloat buttonX = _metaView.frame.size.width - RPTVCControlButtonWidth; CGFloat buttonY = RPTVCControlButtonHeight + RPTVCControlButtonVerticalPadding; - _likeButton.frame = CGRectMake(0.0f, buttonY, buttonWidth, RPTVCControlButtonHeight); - _reblogButton.frame = CGRectMake(buttonWidth + RPTVCControlButtonBorderSize, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); + + // Button order from right-to-left: Like, [Comment], Reblog, + _likeButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, RPTVCControlButtonHeight); + buttonX -= buttonWidth + RPTVCControlButtonBorderSize; + + if (commentsOpen) { + self.commentButton.hidden = NO; + self.commentButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, RPTVCControlButtonHeight); + buttonX -= buttonWidth + RPTVCControlButtonBorderSize; + } else { + self.commentButton.hidden = YES; + } + _reblogButton.frame = CGRectMake(buttonX, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); _bylineLabel.frame = CGRectMake(47.0f, 8.0f, contentWidth - 57.0f, 36.0f); From 3ef7e5b202c83a7cc8f2ebf8c016c954f3446dc0 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 18:27:35 -0800 Subject: [PATCH 05/38] Fix reblog form not showing up --- WordPress/Classes/ReaderPostsViewController.m | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 52b354f35dda..4ec338df9cfb 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -330,7 +330,7 @@ - (void)handleReblogButtonTapped:(id)sender { - (void)handleKeyboardDidShow:(NSNotification *)notification { - UIView *view = self.view; + UIView *view = self.view.superview; CGRect frame = view.frame; CGRect startFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]; CGRect endFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; @@ -365,7 +365,7 @@ - (void)handleKeyboardDidShow:(NSNotification *)notification { - (void)handleKeyboardWillHide:(NSNotification *)notification { - UIView *view = self.view; + UIView *view = self.view.superview; CGRect frame = view.frame; CGRect keyFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; @@ -957,6 +957,15 @@ - (void)fetchBlogsAndPrimaryBlog { }]; } +- (CGSize)tabBarSize { + CGSize tabBarSize = CGSizeZero; + if ([self tabBarController]) { + tabBarSize = [[[self tabBarController] tabBar] bounds].size; + } + + return tabBarSize; +} + #pragma mark - Friend Finder Button @@ -979,10 +988,7 @@ - (void) showFriendFinderNudgeView:(id)sender { self.friendFinderNudgeView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; [self.navigationController.view addSubview:self.friendFinderNudgeView]; - CGSize tabBarSize = CGSizeZero; - if ([self tabBarController]) { - tabBarSize = [[[self tabBarController] tabBar] bounds].size; - } + CGSize tabBarSize = [self tabBarSize]; buttonFrame = self.friendFinderNudgeView.frame; buttonFrame.origin.y = self.navigationController.view.frame.size.height - buttonFrame.size.height - tabBarSize.height; From 12a9b798fb9a43ff70f16ec8f79104f397d0c68a Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 18:35:58 -0800 Subject: [PATCH 06/38] Code formatting cleanup --- WordPress/Classes/ReaderPostsViewController.m | 107 ++++++------------ 1 file changed, 33 insertions(+), 74 deletions(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 4ec338df9cfb..9f0c475f179d 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -178,7 +178,6 @@ - (void)viewDidLoad { }]; } - - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -214,7 +213,6 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; } - - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; @@ -228,7 +226,6 @@ - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie } } - - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; // After rotation, visible images might be scaled up/down @@ -263,7 +260,7 @@ - (void)configureTableHeader { UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 10.0f)]; paddingView.autoresizingMask = UIViewAutoresizingFlexibleWidth; paddingView.backgroundColor = [WPStyleGuide itsEverywhereGrey]; -; + self.tableView.tableHeaderView = paddingView; } @@ -321,7 +318,7 @@ - (void)handleReblogButtonTapped:(id)sender { } // if showing form && same cell as before, dismiss the form. - if([selectedPath compare:path] == NSOrderedSame) { + if ([selectedPath compare:path] == NSOrderedSame) { [self hideReblogForm]; } else { [self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone]; @@ -363,7 +360,6 @@ - (void)handleKeyboardDidShow:(NSNotification *)notification { }]; } - - (void)handleKeyboardWillHide:(NSNotification *)notification { UIView *view = self.view.superview; CGRect frame = view.frame; @@ -374,11 +370,9 @@ - (void)handleKeyboardWillHide:(NSNotification *)notification { view.frame = frame; } - - (void)showReblogForm { - if (_readerReblogFormView.superview != nil) { + if (_readerReblogFormView.superview != nil) return; - } NSIndexPath *path = [self.tableView indexPathForSelectedRow]; _readerReblogFormView.post = (ReaderPost *)[self.resultsController objectAtIndexPath:path]; @@ -395,11 +389,9 @@ - (void)showReblogForm { [_readerReblogFormView.textView becomeFirstResponder]; } - - (void)hideReblogForm { - if(_readerReblogFormView.superview == nil) { + if (_readerReblogFormView.superview == nil) return; - } [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:NO]; @@ -412,11 +404,9 @@ - (void)hideReblogForm { [self.view endEditing:YES]; } - - (void)loadImagesForVisibleRows { NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows]; - for (NSIndexPath *indexPath in visiblePaths) - { + for (NSIndexPath *indexPath in visiblePaths) { ReaderPost *post = (ReaderPost *)[self.resultsController objectAtIndexPath:indexPath]; ReaderPostTableViewCell *cell = (ReaderPostTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; @@ -447,6 +437,7 @@ - (void)loadImagesForVisibleRows { } } + #pragma mark - ReaderTextForm Delegate Methods - (void)readerTextFormDidSend:(ReaderTextFormView *)readerTextForm { @@ -479,9 +470,8 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self loadImagesForVisibleRows]; NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; - if (!selectedIndexPath) { + if (!selectedIndexPath) return; - } __block BOOL found = NO; [[self.tableView indexPathsForVisibleRows] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -492,19 +482,13 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { *stop = YES; }]; - if (found) return; + if (found) + return; [self hideReblogForm]; } -#pragma mark - DetailView Delegate Methods - -- (void)resetView { - -} - - #pragma mark - WPTableViewSublass methods @@ -544,29 +528,23 @@ - (NSString *)noResultsPrompt { return prompt; } - - (UIView *)createNoResultsView { return [WPInfoView WPInfoViewWithTitle:[self noResultsPrompt] message:nil cancelButton:nil]; } - - (NSString *)entityName { return @"ReaderPost"; } - - (NSString *)resultsControllerCacheName { return [ReaderPost currentEndpoint]; } - - (NSDate *)lastSyncDate { return (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:ReaderLastSyncDateKey]; } - - (NSFetchRequest *)fetchRequest { - NSString *endpoint = [ReaderPost currentEndpoint]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; @@ -580,12 +558,10 @@ - (NSFetchRequest *)fetchRequest { return fetchRequest; } - - (NSString *)sectionNameKeyPath { return nil; } - - (UITableViewCell *)newCell { NSString *cellIdentifier = @"ReaderPostCell"; ReaderPostTableViewCell *cell = (ReaderPostTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:cellIdentifier]; @@ -597,9 +573,9 @@ - (UITableViewCell *)newCell { return cell; } - - (void)configureCell:(UITableViewCell *)aCell atIndexPath:(NSIndexPath *)indexPath { - if(!aCell) return; + if (!aCell) + return; ReaderPostTableViewCell *cell = (ReaderPostTableViewCell *)aCell; cell.selectionStyle = UITableViewCellSelectionStyleNone; @@ -624,9 +600,9 @@ - (void)configureCell:(UITableViewCell *)aCell atIndexPath:(NSIndexPath *)indexP - (void)setImageForPost:(ReaderPost *)post forCell:(ReaderPostTableViewCell *)cell indexPath:(NSIndexPath *)indexPath { NSURL *imageURL = post.featuredImageURL; - if (!imageURL) { + if (!imageURL) return; - } + CGSize imageSize = cell.cellImageView.bounds.size; if (CGSizeEqualToSize(imageSize, CGSizeZero)) { imageSize.width = self.tableView.bounds.size.width; @@ -644,16 +620,14 @@ - (BOOL)hasMoreContent { return _hasMoreContent; } - - (void)syncItemsWithSuccess:(void (^)())success failure:(void (^)(NSError *))failure { WPFLogMethod(); // if needs auth. - if([WPCookie hasCookieForURL:[NSURL URLWithString:@"https://wordpress.com"] andUsername:[[WPAccount defaultWordPressComAccount] username]]) { + if ([WPCookie hasCookieForURL:[NSURL URLWithString:@"https://wordpress.com"] andUsername:[[WPAccount defaultWordPressComAccount] username]]) { [self syncReaderItemsWithSuccess:success failure:failure]; return; } - - // + [[WordPressAppDelegate sharedWordPressApplicationDelegate] useDefaultUserAgent]; NSString *username = [[WPAccount defaultWordPressComAccount] username]; NSString *password = [[WPAccount defaultWordPressComAccount] password]; @@ -681,7 +655,6 @@ - (void)syncItemsWithSuccess:(void (^)())success failure:(void (^)(NSError *))fa [authRequest start]; } - - (void)syncReaderItemsWithSuccess:(void (^)())success failure:(void (^)(NSError *))failure { WPFLogMethod(); NSString *endpoint = [ReaderPost currentEndpoint]; @@ -705,22 +678,21 @@ - (void)syncReaderItemsWithSuccess:(void (^)())success failure:(void (^)(NSError [WPMobileStats pingWPComStatsEndpoint:@"home_page_refresh"]; } - - (void)loadMoreWithSuccess:(void (^)())success failure:(void (^)(NSError *error))failure { WPFLogMethod(); - if ([self.resultsController.fetchedObjects count] == 0) { + if ([self.resultsController.fetchedObjects count] == 0) return; - } - if (_loadingMore) return; + if (_loadingMore) + return; + _loadingMore = YES; - ReaderPost *post = self.resultsController.fetchedObjects.lastObject; NSNumber *numberToSync = [NSNumber numberWithInteger:ReaderPostsToSync]; NSString *endpoint = [ReaderPost currentEndpoint]; id before; - if([endpoint isEqualToString:@"freshly-pressed"]) { + if ([endpoint isEqualToString:@"freshly-pressed"]) { // freshly-pressed wants an ISO string but the rest want a timestamp. before = [DateUtils isoStringFromDate:post.date_created_gmt]; } else { @@ -749,12 +721,10 @@ - (void)loadMoreWithSuccess:(void (^)())success failure:(void (^)(NSError *error [WPMobileStats logQuantcastEvent:@"mobile.infinite_scroll"]; } - - (UITableViewRowAnimation)tableViewRowAnimation { return UITableViewRowAnimationNone; } - - (void)onSyncSuccess:(AFHTTPRequestOperation *)operation response:(id)responseObject { WPFLogMethod(); BOOL wasLoadingMore = _loadingMore; @@ -764,7 +734,7 @@ - (void)onSyncSuccess:(AFHTTPRequestOperation *)operation response:(id)responseO NSArray *postsArr = [resp arrayForKey:@"posts"]; if (!postsArr) { - if(wasLoadingMore) { + if (wasLoadingMore) { _hasMoreContent = NO; } return; @@ -786,7 +756,6 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa return [ReaderPostTableViewCell cellHeightForPost:[self.resultsController objectAtIndexPath:indexPath] withWidth:self.tableView.bounds.size.width]; } - - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (_readerReblogFormView.superview != nil) { [self hideReblogForm]; @@ -804,7 +773,6 @@ - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NS return indexPath; } - - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (IS_IPAD) { [tableView deselectRowAtIndexPath:indexPath animated:YES]; @@ -819,7 +787,6 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [WPMobileStats pingWPComStatsEndpoint:@"details_page"]; } - - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)aCell forRowAtIndexPath:(NSIndexPath *)indexPath { [super tableView:tableView willDisplayCell:aCell forRowAtIndexPath:indexPath]; @@ -828,6 +795,7 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)aC [self setImageForPost:post forCell:cell indexPath:indexPath]; } + #pragma mark - ReaderTopicsDelegate Methods - (void)readerTopicChanged { @@ -866,28 +834,24 @@ - (void)readerTopicChanged { #pragma mark - Utility -- (BOOL)isCurrentCategoryFreshlyPressed -{ +- (BOOL)isCurrentCategoryFreshlyPressed { return [[self currentCategory] isEqualToString:@"freshly-pressed"]; } -- (NSString *)currentCategory -{ +- (NSString *)currentCategory { NSDictionary *categoryDetails = [[NSUserDefaults standardUserDefaults] objectForKey:ReaderCurrentTopicKey]; NSString *category = [categoryDetails stringForKey:@"endpoint"]; if (category == nil) return @"reader/following"; - else - return category; + + return category; } -- (NSDictionary *)categoryPropertyForStats -{ +- (NSDictionary *)categoryPropertyForStats { return @{@"category": [self currentCategory]}; } - (void)fetchBlogsAndPrimaryBlog { - NSURL *xmlrpc; NSString *username, *password; WPAccount *account = [WPAccount defaultWordPressComAccount]; @@ -901,7 +865,7 @@ - (void)fetchBlogsAndPrimaryBlog { success:^(AFHTTPRequestOperation *operation, id responseObject) { NSArray *usersBlogs = responseObject; - if([usersBlogs count] > 0) { + if ([usersBlogs count] > 0) { [usersBlogs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSString *title = [obj valueForKey:@"blogName"]; @@ -969,13 +933,12 @@ - (CGSize)tabBarSize { #pragma mark - Friend Finder Button -- (BOOL) shouldDisplayfriendFinderNudgeView { +- (BOOL)shouldDisplayfriendFinderNudgeView { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; return ![userDefaults boolForKey:WPReaderViewControllerDisplayedNativeFriendFinder] && self.friendFinderNudgeView == nil; } - -- (void) showFriendFinderNudgeView:(id)sender { +- (void)showFriendFinderNudgeView:(id)sender { if ([self shouldDisplayfriendFinderNudgeView]) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; @@ -1002,11 +965,9 @@ - (void) showFriendFinderNudgeView:(id)sender { } } - -- (void) hideFriendFinderNudgeView:(id)sender { - if (self.friendFinderNudgeView == nil) { +- (void)hideFriendFinderNudgeView:(id)sender { + if (self.friendFinderNudgeView == nil) return; - } CGRect buttonFrame = self.friendFinderNudgeView.frame; CGRect viewFrame = self.view.frame; @@ -1019,7 +980,6 @@ - (void) hideFriendFinderNudgeView:(id)sender { }]; } - - (void)openFriendFinder:(id)sender { [self hideFriendFinderNudgeView:sender]; WPFriendFinderViewController *controller = [[WPFriendFinderViewController alloc] initWithNibName:@"WPWebViewController" bundle:nil]; @@ -1039,8 +999,7 @@ - (void)openFriendFinder:(id)sender { #pragma mark - WPTableImageSourceDelegate -- (void)tableImageSource:(WPTableImageSource *)tableImageSource imageReady:(UIImage *)image forIndexPath:(NSIndexPath *)indexPath -{ +- (void)tableImageSource:(WPTableImageSource *)tableImageSource imageReady:(UIImage *)image forIndexPath:(NSIndexPath *)indexPath { if (!_isScrollingFast) { ReaderPostTableViewCell *cell = (ReaderPostTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; [cell setFeaturedImage:image]; From 1612a96fd9f7283a5818d2d0f2e0fcdc4f660c78 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 18:53:14 -0800 Subject: [PATCH 07/38] Move author view to the top of the cell --- WordPress/Classes/ReaderPostTableViewCell.m | 48 +++++++++---------- WordPress/Classes/ReaderPostsViewController.m | 2 - 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index d238d28fc49d..bfad4cf28ed7 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -17,10 +17,10 @@ #import "WPAvatarSource.h" #import "ReaderButton.h" -const CGFloat RPTVCVerticalPadding = 10.0f; +const CGFloat RPTVCVerticalPadding = 8.0f; const CGFloat RPTVCHorizontalPadding = 10.0f; -const CGFloat RPTVCMetaViewHeightWithButtons = 101.0f; -const CGFloat RPTVCMetaViewHeightSansButtons = 52.0f; +const CGFloat RPTVCMetaViewHeight = 52.0f; +const CGFloat RPTVAuthorViewHeight = 44.0f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -81,6 +81,8 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { } desiredHeight += vpadding; + + desiredHeight += RPTVAuthorViewHeight; desiredHeight += [post.postTitle sizeWithFont:[UIFont fontWithName:@"OpenSans-Light" size:20.0f] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; desiredHeight += vpadding; @@ -89,11 +91,7 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { desiredHeight += vpadding; // Size of the meta view - if ([post isWPCom]) { - desiredHeight += RPTVCMetaViewHeightWithButtons; - } else { - desiredHeight += RPTVCMetaViewHeightSansButtons; - } + desiredHeight += RPTVCMetaViewHeight; // bottom padding desiredHeight += vpadding; @@ -211,18 +209,11 @@ - (void)buildPostContent { _snippetLabel.lineBreakMode = NSLineBreakByWordWrapping; _snippetLabel.numberOfLines = 0; [_containerView addSubview:_snippetLabel]; -} - -- (void)buildMetaContent { - self.metaView = [[UIView alloc] init]; - _metaView.autoresizingMask = UIViewAutoresizingFlexibleWidth; - _metaView.backgroundColor = [UIColor clearColor]; - [_containerView addSubview:_metaView]; - - self.byView = [[UIView alloc] init]; + + self.byView = [[UIView alloc] init]; _byView.autoresizingMask = UIViewAutoresizingFlexibleWidth; _byView.backgroundColor = [UIColor whiteColor]; - [_metaView addSubview:_byView]; + [_containerView addSubview:_byView]; self.avatarImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 32.0f, 32.0f)]; [_byView addSubview:_avatarImageView]; @@ -235,6 +226,13 @@ - (void)buildMetaContent { _bylineLabel.adjustsFontSizeToFitWidth = NO; _bylineLabel.textColor = [UIColor colorWithHexString:@"c0c0c0"]; [_byView addSubview:_bylineLabel]; +} + +- (void)buildMetaContent { + self.metaView = [[UIView alloc] init]; + _metaView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _metaView.backgroundColor = [UIColor clearColor]; + [_containerView addSubview:_metaView]; self.likeButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; _likeButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; @@ -273,8 +271,11 @@ - (void)layoutSubviews { CGFloat nextY = vpadding; CGFloat height = 0.0f; - CGRect frame = CGRectMake(leftPadding, 0.0f, contentWidth, self.frame.size.height - RPTVCVerticalPadding); + CGRect frame = CGRectMake(leftPadding, 0, contentWidth, self.frame.size.height - RPTVCVerticalPadding); _containerView.frame = frame; + + _byView.frame = CGRectMake(0, 0, contentWidth, RPTVAuthorViewHeight); + nextY += RPTVAuthorViewHeight; // Are we showing an image? What size should it be? if (_showImage) { @@ -294,15 +295,12 @@ - (void)layoutSubviews { nextY += ceilf(height + vpadding); // position the meta view and its subviews - _byView.frame = CGRectMake(0.0f, 0.0f, contentWidth, 52.0f); - - height = [self.post isWPCom] ? RPTVCMetaViewHeightWithButtons : RPTVCMetaViewHeightSansButtons; - _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, height); + _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, RPTVCMetaViewHeight); BOOL commentsOpen = [[self.post commentsOpen] boolValue]; CGFloat buttonWidth = RPTVCControlButtonWidth - RPTVCControlButtonBorderSize; CGFloat buttonX = _metaView.frame.size.width - RPTVCControlButtonWidth; - CGFloat buttonY = RPTVCControlButtonHeight + RPTVCControlButtonVerticalPadding; + CGFloat buttonY = RPTVCControlButtonVerticalPadding; // Button order from right-to-left: Like, [Comment], Reblog, _likeButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, RPTVCControlButtonHeight); @@ -372,9 +370,11 @@ - (void)configureCell:(ReaderPost *)post { if ([self.post isWPCom]) { _likeButton.hidden = NO; _reblogButton.hidden = NO; + _commentButton.hidden = NO; } else { _likeButton.hidden = YES; _reblogButton.hidden = YES; + _commentButton.hidden = YES; } _reblogButton.userInteractionEnabled = ![post.isReblogged boolValue]; diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 9f0c475f179d..6037bb6d6f05 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -866,13 +866,11 @@ - (void)fetchBlogsAndPrimaryBlog { NSArray *usersBlogs = responseObject; if ([usersBlogs count] > 0) { - [usersBlogs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSString *title = [obj valueForKey:@"blogName"]; title = [title stringByDecodingXMLCharacters]; [obj setValue:title forKey:@"blogName"]; }]; - } [[NSUserDefaults standardUserDefaults] setObject:usersBlogs forKey:@"wpcom_users_blogs"]; From 60ff10f513b2f6bb211e7413e7c9804f7d363dd9 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 19:12:11 -0800 Subject: [PATCH 08/38] New title font and padding --- WordPress/Classes/ReaderPostTableViewCell.m | 15 +++++++++++---- WordPress/Info.plist | 1 + WordPress/Merriweather-Bold.ttf | Bin 0 -> 46796 bytes WordPress/WordPress.xcodeproj/project.pbxproj | 9 ++++----- 4 files changed, 16 insertions(+), 9 deletions(-) create mode 100755 WordPress/Merriweather-Bold.ttf diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index bfad4cf28ed7..08292455bcea 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -21,6 +21,7 @@ const CGFloat RPTVCHorizontalPadding = 10.0f; const CGFloat RPTVCMetaViewHeight = 52.0f; const CGFloat RPTVAuthorViewHeight = 44.0f; +const CGFloat RPTVCTitlePadding = 20.0f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -84,8 +85,9 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { desiredHeight += RPTVAuthorViewHeight; - desiredHeight += [post.postTitle sizeWithFont:[UIFont fontWithName:@"OpenSans-Light" size:20.0f] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; - desiredHeight += vpadding; + desiredHeight += RPTVCTitlePadding; + desiredHeight += [post.postTitle sizeWithFont:[self postTitleFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + desiredHeight += RPTVCTitlePadding; desiredHeight += [post.summary sizeWithFont:[UIFont fontWithName:@"OpenSans" size:13.0f] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; desiredHeight += vpadding; @@ -99,6 +101,10 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { return ceil(desiredHeight); } ++ (UIFont *)postTitleFont { + return [UIFont fontWithName:@"Merriweather-Bold" size:21.0f]; +} + #pragma mark - Lifecycle Methods @@ -195,7 +201,7 @@ - (void)buildPostContent { self.titleLabel = [[UILabel alloc] init]; _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.font = [UIFont fontWithName:@"OpenSans-Light" size:20.0f]; + _titleLabel.font = [[self class] postTitleFont]; _titleLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; _titleLabel.lineBreakMode = NSLineBreakByWordWrapping; _titleLabel.numberOfLines = 0; @@ -285,9 +291,10 @@ - (void)layoutSubviews { } // Position the title + nextY += RPTVCTitlePadding; height = ceil([_titleLabel suggestedSizeForWidth:contentWidth].height); _titleLabel.frame = CGRectMake(RPTVCHorizontalPadding, nextY, innerContentWidth, height); - nextY += height + vpadding; + nextY += height + RPTVCTitlePadding; // Position the snippet height = ceil([_snippetLabel suggestedSizeForWidth:contentWidth].height); diff --git a/WordPress/Info.plist b/WordPress/Info.plist index f06e1535e03a..967f0e3eb133 100644 --- a/WordPress/Info.plist +++ b/WordPress/Info.plist @@ -54,6 +54,7 @@ OpenSans-Italic.ttf OpenSans-BoldItalic.ttf OpenSans-LightItalic.ttf + Merriweather-Bold.ttf UIBackgroundModes diff --git a/WordPress/Merriweather-Bold.ttf b/WordPress/Merriweather-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..2340777c83a70fd3c02b4e526f61b33d6a689a89 GIT binary patch literal 46796 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 YbJtGG&>JUaMuFHdPYQ@*95vhj1I&f3L;wH) literal 0 HcmV?d00001 diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 9acd29d995db..7c4f02375278 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -292,6 +292,7 @@ 462F4E0A18369F0B0028D2F8 /* BlogDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 462F4E0718369F0B0028D2F8 /* BlogDetailsViewController.m */; }; 462F4E0B18369F0B0028D2F8 /* BlogListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 462F4E0918369F0B0028D2F8 /* BlogListViewController.m */; }; 462F4E0E18369F300028D2F8 /* WPTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 462F4E0D18369F300028D2F8 /* WPTableViewCell.m */; }; + 462F4E10183867AE0028D2F8 /* Merriweather-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */; }; 5D0077A7182AE9DF00F865DB /* ReaderMediaQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */; }; 5D119DA3176FBE040073D83A /* UIImageView+AFNetworkingExtra.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D119DA2176FBE040073D83A /* UIImageView+AFNetworkingExtra.m */; }; 5D1392A7157D4D92007D51B8 /* StatsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1392A6157D4D92007D51B8 /* StatsWebViewController.m */; }; @@ -950,7 +951,6 @@ E22257EE1829C15B00F76926 /* textPushDetailIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = E22257EC1829C15B00F76926 /* textPushDetailIcon.png */; }; E22257EF1829C15B00F76926 /* textPushDetailIcon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E22257ED1829C15B00F76926 /* textPushDetailIcon@2x.png */; }; E232E5FE182E9E8600792CA0 /* icon-username-field@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E232E5FD182E9E8600792CA0 /* icon-username-field@2x.png */; }; - E232E600182EA15A00792CA0 /* icon-username-field.png in Resources */ = {isa = PBXBuildFile; fileRef = E232E5FF182EA15A00792CA0 /* icon-username-field.png */; }; E232E603182EA16200792CA0 /* icon-password-field.png in Resources */ = {isa = PBXBuildFile; fileRef = E232E601182EA16200792CA0 /* icon-password-field.png */; }; E232E604182EA16200792CA0 /* icon-password-field@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E232E602182EA16200792CA0 /* icon-password-field@2x.png */; }; E232E607182EA1C400792CA0 /* icon-url-field.png in Resources */ = {isa = PBXBuildFile; fileRef = E232E605182EA1C400792CA0 /* icon-url-field.png */; }; @@ -1309,6 +1309,7 @@ 462F4E0918369F0B0028D2F8 /* BlogListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlogListViewController.m; sourceTree = ""; }; 462F4E0C18369F300028D2F8 /* WPTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPTableViewCell.h; sourceTree = ""; }; 462F4E0D18369F300028D2F8 /* WPTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPTableViewCell.m; sourceTree = ""; }; + 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Merriweather-Bold.ttf"; sourceTree = ""; }; 5D0077A5182AE9DF00F865DB /* ReaderMediaQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderMediaQueue.h; sourceTree = ""; }; 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderMediaQueue.m; sourceTree = ""; }; 5D119DA1176FBE040073D83A /* UIImageView+AFNetworkingExtra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworkingExtra.h"; sourceTree = ""; }; @@ -3116,6 +3117,7 @@ 858DE3FF172F9991000AC628 /* Fonts */ = { isa = PBXGroup; children = ( + 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */, 5D358D6417723DB500739AA4 /* OpenSans-Bold.ttf */, 858DE41017303BB4000AC628 /* OpenSans-Light.ttf */, 858DE41117303BB4000AC628 /* OpenSans-Regular.ttf */, @@ -3431,7 +3433,6 @@ FD22C2B616CD2B20002BA030 /* navbar_settings@2x.png */, E15051CC16CA8E4900D3DDDC /* logo_jetpack.png */, E15051CD16CA8E4900D3DDDC /* logo_jetpack@2x.png */, - 3716E40216729B960035F8C4 /* action_icon_followed.png */, 3716E40316729B960035F8C4 /* action_icon_followed@2x.png */, 3716E40416729B960035F8C4 /* action_icon_replied.png */, 3716E40516729B960035F8C4 /* action_icon_replied@2x.png */, @@ -3630,8 +3631,6 @@ 5D7BEA2F17749FFD00423E7F /* wporg_blavatar@2x.png */, 374CB16315B9907600DD0EBC /* WPpregressHUDBackground.png */, 374CB16415B9907600DD0EBC /* WPpregressHUDBackground@2x.png */, - E12A08E116C9706200E3DDF6 /* clouds_header.png */, - E12A08E216C9706200E3DDF6 /* clouds_header@2x.png */, E15051CC16CA8E4900D3DDDC /* logo_jetpack.png */, E15051CD16CA8E4900D3DDDC /* logo_jetpack@2x.png */, FD22C2B516CD2B20002BA030 /* navbar_settings.png */, @@ -4371,6 +4370,7 @@ E177087E13AAC19700EA6C72 /* redo~ipad.png in Resources */, E177087F13AAC19700EA6C72 /* redoDisabled~ipad.png in Resources */, 85AC70F017C71B5100985E3B /* comment-default-gravatar-image.png in Resources */, + 462F4E10183867AE0028D2F8 /* Merriweather-Bold.ttf in Resources */, E177088013AAC19700EA6C72 /* undo~ipad.png in Resources */, E177088113AAC19700EA6C72 /* undoDisabled~ipad.png in Resources */, 85325A4417BB0DF8008E87D1 /* icon-menu-pages-active.png in Resources */, @@ -4866,7 +4866,6 @@ 5D7BEA3617749FFD00423E7F /* wporg_blavatar.png in Resources */, 5D7BEA3717749FFD00423E7F /* wporg_blavatar@2x.png in Resources */, 5D7BEA3A1774A02400423E7F /* cell-separator.png in Resources */, - 85ED989D17DFA93800090D0B /* AppIcon57x57@2x.png in Resources */, E233414A182DB62900A4CC40 /* btn-back-chevron-tapped@2x.png in Resources */, 85325A3717BB0DF8008E87D1 /* icon-menu-reader-active@2x.png in Resources */, 5D7BEA3B1774A02400423E7F /* cell-separator@2x.png in Resources */, From 4ec8ab0cf1297928ef1ef9b9ebf7a93b88801f43 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 19:45:31 -0800 Subject: [PATCH 09/38] Render a horizontal line and update padding --- WordPress/Classes/ReaderPostTableViewCell.m | 59 +++++++++++---------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 08292455bcea..65f2fe020b9d 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -17,11 +17,12 @@ #import "WPAvatarSource.h" #import "ReaderButton.h" -const CGFloat RPTVCVerticalPadding = 8.0f; -const CGFloat RPTVCHorizontalPadding = 10.0f; +const CGFloat RPTVCAuthorPadding = 8.0f; +const CGFloat RPTVCHorizontalInnerPadding = 12.0f; +const CGFloat RPTVCHorizontalOuterPadding = 8.0f; const CGFloat RPTVCMetaViewHeight = 52.0f; -const CGFloat RPTVAuthorViewHeight = 44.0f; -const CGFloat RPTVCTitlePadding = 20.0f; +const CGFloat RPTVAuthorViewHeight = 36.0f; +const CGFloat RPTVCVerticalPadding = 20.0f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -38,6 +39,7 @@ @interface ReaderPostTableViewCell() @property (nonatomic, strong) UILabel *snippetLabel; @property (nonatomic, strong) UIView *metaView; +@property (nonatomic, strong) CALayer *metaBorder; @property (nonatomic, strong) UIView *byView; @property (nonatomic, strong) UILabel *bylineLabel; @@ -62,7 +64,6 @@ @implementation ReaderPostTableViewCell { + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { CGFloat desiredHeight = 0.0f; - CGFloat vpadding = RPTVCVerticalPadding; // Margins CGFloat contentWidth = width; @@ -72,31 +73,29 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { // iPhone has extra padding around each cell if (IS_IPHONE) { - contentWidth -= RPTVCHorizontalPadding * 2; + contentWidth -= RPTVCHorizontalOuterPadding * 2; } + desiredHeight += RPTVCAuthorPadding; + desiredHeight += RPTVAuthorViewHeight; + desiredHeight += RPTVCAuthorPadding; + // Are we showing an image? What size should it be? if (post.featuredImageURL) { CGFloat height = ceilf((contentWidth * 0.66f)); desiredHeight += height; } - desiredHeight += vpadding; - - desiredHeight += RPTVAuthorViewHeight; - - desiredHeight += RPTVCTitlePadding; + desiredHeight += RPTVCVerticalPadding; desiredHeight += [post.postTitle sizeWithFont:[self postTitleFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; - desiredHeight += RPTVCTitlePadding; + desiredHeight += RPTVCVerticalPadding; desiredHeight += [post.summary sizeWithFont:[UIFont fontWithName:@"OpenSans" size:13.0f] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; - desiredHeight += vpadding; + + desiredHeight += RPTVCVerticalPadding * 2; // Size of the meta view desiredHeight += RPTVCMetaViewHeight; - - // bottom padding - desiredHeight += vpadding; return ceil(desiredHeight); } @@ -239,6 +238,10 @@ - (void)buildMetaContent { _metaView.autoresizingMask = UIViewAutoresizingFlexibleWidth; _metaView.backgroundColor = [UIColor clearColor]; [_containerView addSubview:_metaView]; + + self.metaBorder = [[CALayer alloc] init]; + _metaBorder.backgroundColor = [[UIColor colorWithHexString:@"f1f1f1"] CGColor]; + [_metaView.layer addSublayer:_metaBorder]; self.likeButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; _likeButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; @@ -270,39 +273,39 @@ - (void)buildMetaContent { - (void)layoutSubviews { [super layoutSubviews]; - CGFloat leftPadding = IS_IPHONE ? RPTVCHorizontalPadding : 0; + CGFloat leftPadding = IS_IPHONE ? RPTVCHorizontalOuterPadding : 0; CGFloat contentWidth = self.frame.size.width - leftPadding * 2; - CGFloat innerContentWidth = contentWidth - RPTVCHorizontalPadding * 2; - CGFloat vpadding = RPTVCVerticalPadding; - CGFloat nextY = vpadding; + CGFloat innerContentWidth = contentWidth - RPTVCHorizontalInnerPadding * 2; + CGFloat nextY = RPTVCAuthorPadding; CGFloat height = 0.0f; CGRect frame = CGRectMake(leftPadding, 0, contentWidth, self.frame.size.height - RPTVCVerticalPadding); _containerView.frame = frame; _byView.frame = CGRectMake(0, 0, contentWidth, RPTVAuthorViewHeight); - nextY += RPTVAuthorViewHeight; + nextY += RPTVAuthorViewHeight + RPTVCAuthorPadding; // Are we showing an image? What size should it be? if (_showImage) { height = ceilf(contentWidth * 0.66f); - self.cellImageView.frame = CGRectMake(RPTVCHorizontalPadding, nextY, innerContentWidth, height); + self.cellImageView.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); nextY += height; } // Position the title - nextY += RPTVCTitlePadding; + nextY += RPTVCVerticalPadding; height = ceil([_titleLabel suggestedSizeForWidth:contentWidth].height); - _titleLabel.frame = CGRectMake(RPTVCHorizontalPadding, nextY, innerContentWidth, height); - nextY += height + RPTVCTitlePadding; + _titleLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); + nextY += height + RPTVCVerticalPadding; // Position the snippet height = ceil([_snippetLabel suggestedSizeForWidth:contentWidth].height); - _snippetLabel.frame = CGRectMake(RPTVCHorizontalPadding, nextY, innerContentWidth, height); - nextY += ceilf(height + vpadding); + _snippetLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); + nextY += ceilf(height + RPTVCVerticalPadding); // position the meta view and its subviews _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, RPTVCMetaViewHeight); + _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding*2, 1.0); BOOL commentsOpen = [[self.post commentsOpen] boolValue]; CGFloat buttonWidth = RPTVCControlButtonWidth - RPTVCControlButtonBorderSize; @@ -324,7 +327,7 @@ - (void)layoutSubviews { _bylineLabel.frame = CGRectMake(47.0f, 8.0f, contentWidth - 57.0f, 36.0f); - CGFloat sideBorderX = RPTVCHorizontalPadding - 1; // Just to the left of the container + CGFloat sideBorderX = RPTVCHorizontalOuterPadding - 1; // Just to the left of the container CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding + 1.f; // Just below it _sideBorderView.frame = CGRectMake(sideBorderX, 1.f, self.frame.size.width - sideBorderX*2, sideBorderHeight); } From 5dbbe42df289dfdb03aa6abd9d7292b6844e19d2 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 19:48:57 -0800 Subject: [PATCH 10/38] Make images display full-width --- WordPress/Classes/ReaderPostTableViewCell.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 65f2fe020b9d..a4c6892d2b8d 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -288,7 +288,7 @@ - (void)layoutSubviews { // Are we showing an image? What size should it be? if (_showImage) { height = ceilf(contentWidth * 0.66f); - self.cellImageView.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); + self.cellImageView.frame = CGRectMake(0, nextY, contentWidth, height); nextY += height; } From 856f2bacb88a25520afe025871c39a17675f7609 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 20:10:35 -0800 Subject: [PATCH 11/38] Prettier height handling --- WordPress/Classes/ReaderPostTableViewCell.m | 42 +++++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index a4c6892d2b8d..f9b73f382f06 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -87,10 +87,13 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { } desiredHeight += RPTVCVerticalPadding; - desiredHeight += [post.postTitle sizeWithFont:[self postTitleFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + desiredHeight += [post.postTitle sizeWithFont:[self titleFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; desiredHeight += RPTVCVerticalPadding; - desiredHeight += [post.summary sizeWithFont:[UIFont fontWithName:@"OpenSans" size:13.0f] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + if ([post.summary length] > 0) { + NSString *postSummary = [self prettySummaryForPost:post]; + desiredHeight += [postSummary sizeWithFont:[self summaryFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + } desiredHeight += RPTVCVerticalPadding * 2; @@ -100,10 +103,24 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { return ceil(desiredHeight); } -+ (UIFont *)postTitleFont { ++ (NSString *)prettySummaryForPost:(ReaderPost *)post { + NSString *prettySummary = [post.summary trim]; + NSInteger newline = [post.summary rangeOfString:@"\n"].location; + + if (newline != NSNotFound) + prettySummary = [post.summary substringToIndex:newline]; + + return prettySummary; +} + ++ (UIFont *)titleFont { return [UIFont fontWithName:@"Merriweather-Bold" size:21.0f]; } ++ (UIFont *)summaryFont { + return [UIFont fontWithName:@"OpenSans" size:14.0f]; +} + #pragma mark - Lifecycle Methods @@ -200,7 +217,7 @@ - (void)buildPostContent { self.titleLabel = [[UILabel alloc] init]; _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.font = [[self class] postTitleFont]; + _titleLabel.font = [[self class] titleFont]; _titleLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; _titleLabel.lineBreakMode = NSLineBreakByWordWrapping; _titleLabel.numberOfLines = 0; @@ -209,10 +226,10 @@ - (void)buildPostContent { self.snippetLabel = [[UILabel alloc] init]; _snippetLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _snippetLabel.backgroundColor = [UIColor clearColor]; - _snippetLabel.font = [UIFont fontWithName:@"OpenSans" size:13.0f]; + _snippetLabel.font = [[self class] summaryFont]; _snippetLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; - _snippetLabel.lineBreakMode = NSLineBreakByWordWrapping; - _snippetLabel.numberOfLines = 0; + _snippetLabel.lineBreakMode = NSLineBreakByTruncatingTail; + _snippetLabel.numberOfLines = 4; [_containerView addSubview:_snippetLabel]; self.byView = [[UIView alloc] init]; @@ -299,9 +316,11 @@ - (void)layoutSubviews { nextY += height + RPTVCVerticalPadding; // Position the snippet - height = ceil([_snippetLabel suggestedSizeForWidth:contentWidth].height); - _snippetLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); - nextY += ceilf(height + RPTVCVerticalPadding); + if ([self.post.summary length] > 0) { + height = ceil([_snippetLabel suggestedSizeForWidth:contentWidth].height); + _snippetLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); + nextY += ceilf(height + RPTVCVerticalPadding); + } // position the meta view and its subviews _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, RPTVCMetaViewHeight); @@ -363,7 +382,7 @@ - (void)configureCell:(ReaderPost *)post { [self setAvatar:nil]; _titleLabel.text = [post.postTitle trim]; - _snippetLabel.text = post.summary; + _snippetLabel.text = [[self class] prettySummaryForPost:post]; NSString *onBlog = [NSString stringWithFormat:NSLocalizedString(@"on %@", @"'on ', displayed on reader list for each post"), post.blogName]; _bylineLabel.text = [NSString stringWithFormat:@"%@\n%@", [post prettyDateString], onBlog]; @@ -444,5 +463,4 @@ - (void)handleLikeButtonTapped:(id)sender { [self updateControlBar]; } - @end From 08fc38ea4ad9ee6ad9c93792167212236f4b4712 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 23:16:46 -0800 Subject: [PATCH 12/38] Add follow button, move time label --- WordPress/Classes/ReaderPostTableViewCell.m | 65 ++++++++++++++++----- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index f9b73f382f06..e62fdbbad214 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -21,8 +21,9 @@ const CGFloat RPTVCHorizontalInnerPadding = 12.0f; const CGFloat RPTVCHorizontalOuterPadding = 8.0f; const CGFloat RPTVCMetaViewHeight = 52.0f; -const CGFloat RPTVAuthorViewHeight = 36.0f; +const CGFloat RPTVAuthorViewHeight = 32.0f; const CGFloat RPTVCVerticalPadding = 20.0f; +const CGFloat RPTVCAvatarSize = 32.0f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -37,6 +38,8 @@ @interface ReaderPostTableViewCell() @property (nonatomic, strong) UIView *containerView; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UILabel *snippetLabel; +@property (nonatomic, strong) UILabel *timeLabel; +@property (nonatomic, strong) UIButton *followButton; @property (nonatomic, strong) UIView *metaView; @property (nonatomic, strong) CALayer *metaBorder; @@ -235,19 +238,36 @@ - (void)buildPostContent { self.byView = [[UIView alloc] init]; _byView.autoresizingMask = UIViewAutoresizingFlexibleWidth; _byView.backgroundColor = [UIColor whiteColor]; + _byView.userInteractionEnabled = YES; [_containerView addSubview:_byView]; - self.avatarImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 32.0f, 32.0f)]; + CGRect avatarFrame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCAuthorPadding, RPTVCAvatarSize, RPTVCAvatarSize); + self.avatarImageView = [[UIImageView alloc] initWithFrame:avatarFrame]; [_byView addSubview:_avatarImageView]; self.bylineLabel = [[UILabel alloc] init]; _bylineLabel.backgroundColor = [UIColor clearColor]; - _bylineLabel.numberOfLines = 2; + _bylineLabel.numberOfLines = 1; _bylineLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _bylineLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; _bylineLabel.adjustsFontSizeToFitWidth = NO; - _bylineLabel.textColor = [UIColor colorWithHexString:@"c0c0c0"]; + _bylineLabel.textColor = [UIColor colorWithHexString:@"333"]; [_byView addSubview:_bylineLabel]; + + self.followButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_followButton setSelected:[self.post.isFollowing boolValue]]; + //_followButton.layer.cornerRadius = 3.0f; + _followButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + _followButton.backgroundColor = [UIColor clearColor]; + _followButton.titleLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; + NSString *followString = NSLocalizedString(@"Follow", @"Prompt to follow a blog."); + NSString *followedString = NSLocalizedString(@"Following", @"User is following the blog."); + [_followButton setTitle:followString forState:UIControlStateNormal]; + [_followButton setTitle:followedString forState:UIControlStateSelected]; + [_followButton setImage:[UIImage imageNamed:@"reader-postaction-follow"] forState:UIControlStateNormal]; + [_followButton setImage:[UIImage imageNamed:@"reader-postaction-following"] forState:UIControlStateSelected]; + [_followButton setTitleColor:[UIColor colorWithHexString:@"aaa"] forState:UIControlStateNormal]; + [_byView addSubview:_followButton]; } - (void)buildMetaContent { @@ -259,14 +279,19 @@ - (void)buildMetaContent { self.metaBorder = [[CALayer alloc] init]; _metaBorder.backgroundColor = [[UIColor colorWithHexString:@"f1f1f1"] CGColor]; [_metaView.layer addSublayer:_metaBorder]; + + self.timeLabel = [[UILabel alloc] init]; + _timeLabel.backgroundColor = [UIColor clearColor]; + _timeLabel.numberOfLines = 1; + _timeLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _timeLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; + _timeLabel.adjustsFontSizeToFitWidth = NO; + _timeLabel.textColor = [UIColor colorWithHexString:@"aaa"]; + [_metaView addSubview:_timeLabel]; self.likeButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; _likeButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; _likeButton.backgroundColor = [UIColor whiteColor]; - [_likeButton setTitleEdgeInsets:UIEdgeInsetsMake(0.0f, -5.0f, 0.0f, 0.0f)]; - [_likeButton.titleLabel setFont:[UIFont fontWithName:@"OpenSans-Bold" size:10.0f]]; - [_likeButton setTitleColor:[UIColor colorWithRed:84.0f/255.0f green:173.0f/255.0f blue:211.0f/255.0f alpha:1.0f] forState:UIControlStateNormal]; - [_likeButton setTitleColor:[UIColor colorWithRed:221.0f/255.0f green:118.0f/255.0f blue:43.0f/255.0f alpha:1.0f] forState:UIControlStateSelected]; [_likeButton setImage:[UIImage imageNamed:@"reader-postaction-like-blue"] forState:UIControlStateNormal]; [_likeButton setImage:[UIImage imageNamed:@"reader-postaction-like-active"] forState:UIControlStateSelected]; [_likeButton addTarget:self action:@selector(handleLikeButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; @@ -300,6 +325,13 @@ - (void)layoutSubviews { _containerView.frame = frame; _byView.frame = CGRectMake(0, 0, contentWidth, RPTVAuthorViewHeight); + CGFloat bylineX = RPTVCAvatarSize + RPTVCAuthorPadding + RPTVCHorizontalInnerPadding; + _bylineLabel.frame = CGRectMake(bylineX, RPTVCAuthorPadding - 2, contentWidth - bylineX, 18); + + CGFloat followX = bylineX - 4; // Fudge factor for image alignment + CGFloat followY = RPTVCAuthorPadding + _bylineLabel.frame.size.height - 2; + _followButton.frame = CGRectMake(followX, followY, contentWidth - bylineX, 18); + nextY += RPTVAuthorViewHeight + RPTVCAuthorPadding; // Are we showing an image? What size should it be? @@ -322,9 +354,12 @@ - (void)layoutSubviews { nextY += ceilf(height + RPTVCVerticalPadding); } - // position the meta view and its subviews - _metaView.frame = CGRectMake(0.0f, nextY, contentWidth, RPTVCMetaViewHeight); - _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding*2, 1.0); + // Position the meta view and its subviews + _metaView.frame = CGRectMake(0, nextY, contentWidth, RPTVCMetaViewHeight); + _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, 1.0); + + CGFloat timeWidth = contentWidth - RPTVCControlButtonWidth * 3; + _timeLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCControlButtonVerticalPadding, timeWidth, RPTVCControlButtonHeight); BOOL commentsOpen = [[self.post commentsOpen] boolValue]; CGFloat buttonWidth = RPTVCControlButtonWidth - RPTVCControlButtonBorderSize; @@ -344,11 +379,9 @@ - (void)layoutSubviews { } _reblogButton.frame = CGRectMake(buttonX, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); - _bylineLabel.frame = CGRectMake(47.0f, 8.0f, contentWidth - 57.0f, 36.0f); - CGFloat sideBorderX = RPTVCHorizontalOuterPadding - 1; // Just to the left of the container CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding + 1.f; // Just below it - _sideBorderView.frame = CGRectMake(sideBorderX, 1.f, self.frame.size.width - sideBorderX*2, sideBorderHeight); + _sideBorderView.frame = CGRectMake(sideBorderX, 1.f, self.frame.size.width - sideBorderX * 2, sideBorderHeight); } - (void)prepareForReuse { @@ -384,8 +417,8 @@ - (void)configureCell:(ReaderPost *)post { _titleLabel.text = [post.postTitle trim]; _snippetLabel.text = [[self class] prettySummaryForPost:post]; - NSString *onBlog = [NSString stringWithFormat:NSLocalizedString(@"on %@", @"'on ', displayed on reader list for each post"), post.blogName]; - _bylineLabel.text = [NSString stringWithFormat:@"%@\n%@", [post prettyDateString], onBlog]; + _bylineLabel.text = post.blogName; + _timeLabel.text = [post prettyDateString]; self.showImage = NO; self.cellImageView.hidden = YES; From 2f18ffcf643d01f85a356903a1406c28b69c8da6 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 23:19:40 -0800 Subject: [PATCH 13/38] Change color of follow icons --- .../Images/reader-postaction-follow.png | Bin 468 -> 1105 bytes .../Images/reader-postaction-follow@2x.png | Bin 736 -> 1301 bytes .../Images/reader-postaction-following.png | Bin 523 -> 1144 bytes .../Images/reader-postaction-following@2x.png | Bin 881 -> 1394 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/WordPress/Resources/Images/reader-postaction-follow.png b/WordPress/Resources/Images/reader-postaction-follow.png index 5c6be6097a08de78984771c659adf3614a9cd787..8aecf396f1ab39c2261aa952d9e6c9d6faca16be 100644 GIT binary patch literal 1105 zcmaJ=Pe>F|7$05TO0*)ZaEpA6*gx9&vwzebTy_8EMkC9*&~^|VXWr^$GjE!Cw&O-& z5osV1-HHxL9r6-V1W|_~D(Vm(x@3U|4-s90BDw_jMqTaDHZb$v_xSyO-}k-mH&@a< zN9t-kH55hFrMlx8vTk+Wjc)R7{IMjFr2!{$xEJMdK{6o~QP3a+DNP!J87L`Zr{BVM zigGon*&NP^#{?N^jO1V#TQdloqS`xcLy|`z27_=&)x-3+r_X4hDq;F~P~=1-28Y$| zq6vG8Jz2RpB8L>Zvjeo-0uj(4mVm9D(k;Ob)62R7**nK94VEEzBuuXql@rq-hD->8 zOwcQHd;qkD7(U1c+W5o3$MJra^Rv9)%liZ_B=AA7`p_hsspN%BJh_^SL}7XuV?$us zLZQGE{0uUOSUwaAv7C?f`Md<-wZ?QT*w&AF63Ob;WBtYKt;SPUExC0W&-_~0@@6or&-VM&)^DjueZ1f!~o5RF6=t%;;R z(9+`P`Gh~zl8CiM+G5El=a2Y;$r3k?gG` zSy0Q@!k5)s|c{E9TEFD+cn>kV9ohZCw4c9uj|bU=bw0)ibt~c z$HCuAOP#Lf@zaK9w)pdFC8&P!Jv}|q)xI|nz?Bi#_|2WvjJ-vAyp zrWUpwMbT|mmB*xBOOc1uwKrVZ#|lW|;b@#z^#eVnp z^VN0FXSz@y*w=ih;^5ZLmuk*!SUlVH?w7kiU%8Q^u3bG*pZ67OorY40p7{Ofz{Ni; CeO^ES delta 442 zcmV;r0Y(1N2-E|RB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01FZT01FZU(%pXi0000L zbVXQnLvm$dbZKvHAXI5>WdJrWF*q+VGXi;b)Bpeg9CSrkbW?9;ba!ELWdK2BZ(?O2 zMrm?ocW-iQb09-gHt4*vi~s-uElET{R5*>Tlf6sBP!z>~H-Dx|7eV~U5JBmpn~rf) z|A3CJc6Z6-kk0997x%h2IJUbA4(X_ylPIJ^r6Pz>(9-8%A}@~wk$B+^_v4&RqFQt1C6uysd700^Sk2Yg^HNj(AW&~w`+f#^FB5rQc00EYz)&qB{_6cRN1gI(Y% z^+V6CC-JU^*?$W?_d0blJFqP|Hb&}+NKcPdjGD|2Y)hQURQ+^rZfq>+7 zZuSQ^nlFV4W<=frf+$u1t)11h_%(>)Z$MI$t6*bc?wnuDtP$gs7f^4^Y^6Wb7nlBHH1vr-a{vGU07*qoM6N<$g7a;>%>V!Z diff --git a/WordPress/Resources/Images/reader-postaction-follow@2x.png b/WordPress/Resources/Images/reader-postaction-follow@2x.png index 173970cc906ee7f2da89456b90fe7fd137de9007..3cd80a817078cd61a096fcfe1c3bfc59204d0942 100644 GIT binary patch literal 1301 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 D!##Fw delta 497 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 From f1e96d3af8aece7d292a6901f9c3a359b6584d65 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 23:34:17 -0800 Subject: [PATCH 14/38] Improve alignment of time and buttons --- WordPress/Classes/ReaderPostTableViewCell.m | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index e62fdbbad214..6131329e704d 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -24,11 +24,11 @@ const CGFloat RPTVAuthorViewHeight = 32.0f; const CGFloat RPTVCVerticalPadding = 20.0f; const CGFloat RPTVCAvatarSize = 32.0f; +const CGFloat RPTVCLineHeight = 1.0f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; const CGFloat RPTVCControlButtonWidth = 48.0f; -const CGFloat RPTVCControlButtonVerticalPadding = 4.0f; const CGFloat RPTVCControlButtonSpacing = 12.0f; const CGFloat RPTVCControlButtonBorderSize = 0.0f; @@ -356,32 +356,32 @@ - (void)layoutSubviews { // Position the meta view and its subviews _metaView.frame = CGRectMake(0, nextY, contentWidth, RPTVCMetaViewHeight); - _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, 1.0); - - CGFloat timeWidth = contentWidth - RPTVCControlButtonWidth * 3; - _timeLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCControlButtonVerticalPadding, timeWidth, RPTVCControlButtonHeight); - + _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCLineHeight); + BOOL commentsOpen = [[self.post commentsOpen] boolValue]; - CGFloat buttonWidth = RPTVCControlButtonWidth - RPTVCControlButtonBorderSize; + CGFloat buttonWidth = RPTVCControlButtonWidth; CGFloat buttonX = _metaView.frame.size.width - RPTVCControlButtonWidth; - CGFloat buttonY = RPTVCControlButtonVerticalPadding; + CGFloat buttonY = RPTVCLineHeight; // Just below the line // Button order from right-to-left: Like, [Comment], Reblog, _likeButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, RPTVCControlButtonHeight); - buttonX -= buttonWidth + RPTVCControlButtonBorderSize; + buttonX -= buttonWidth + RPTVCControlButtonSpacing; if (commentsOpen) { self.commentButton.hidden = NO; self.commentButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, RPTVCControlButtonHeight); - buttonX -= buttonWidth + RPTVCControlButtonBorderSize; + buttonX -= buttonWidth + RPTVCControlButtonSpacing; } else { self.commentButton.hidden = YES; } _reblogButton.frame = CGRectMake(buttonX, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); + CGFloat timeWidth = contentWidth - _reblogButton.frame.origin.x; + _timeLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCLineHeight, timeWidth, RPTVCControlButtonHeight); + CGFloat sideBorderX = RPTVCHorizontalOuterPadding - 1; // Just to the left of the container - CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding + 1.f; // Just below it - _sideBorderView.frame = CGRectMake(sideBorderX, 1.f, self.frame.size.width - sideBorderX * 2, sideBorderHeight); + CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding + 1; // Just below it + _sideBorderView.frame = CGRectMake(sideBorderX, 1, self.frame.size.width - sideBorderX * 2, sideBorderHeight); } - (void)prepareForReuse { From 74734ade9df7c1d21081a425b5899464d677ed18 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sat, 16 Nov 2013 23:38:59 -0800 Subject: [PATCH 15/38] New colors for Reader buttons --- .../Images/reader-postaction-comment-blue.png | Bin 1165 -> 1171 bytes .../reader-postaction-comment-blue@2x.png | Bin 1395 -> 1393 bytes .../Images/reader-postaction-like-blue.png | Bin 1318 -> 1318 bytes .../Images/reader-postaction-like-blue@2x.png | Bin 1654 -> 1651 bytes .../Images/reader-postaction-reblog-blue.png | Bin 1149 -> 1149 bytes .../reader-postaction-reblog-blue@2x.png | Bin 1376 -> 1375 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/WordPress/Resources/Images/reader-postaction-comment-blue.png b/WordPress/Resources/Images/reader-postaction-comment-blue.png index aff9f6d04200910d48433f8f1bb1d4138923ed67..390ce5d72b74439456bd1f41feab5bcb860adcf7 100644 GIT binary patch delta 445 zcmeC>oXk1lhN`Jf+{VV&-aKXy|HeY3Ax|;b`IP=44>(Xk_X(S%*mmrpN`S zqF;>0lb14?P4;J!p8SnTadJ14)MP_u$9hACt!)epjI5q6jv*DdlK%YvZ-3Z46o@5gRyP>D#U5TvF6bEV0=ox`_AT~BGF*G$cHZd$9GB7bRFEBDMFg7hQG&(glIx;tr z{dAMu0V0!X0c(?X0xt+4cx`Y^O*%=F!2>`~e!15Cb8Tr2;kqGLzf_I{`D3+yWVs zF#|z=Vm?XH00030Nkl5N08dH512|a5L;wH)07*qoM6N<$f>yzqG5`Po diff --git a/WordPress/Resources/Images/reader-postaction-comment-blue@2x.png b/WordPress/Resources/Images/reader-postaction-comment-blue@2x.png index ba9f9543c8157446ca4fcc1d2c59d86a4784efd7..811e1dbe21877b36b9517ad77ddab66a44bef4a6 100644 GIT binary patch delta 669 zcmey&^^t4B4OLU!WCKGJ1#?S1LsLT&3qu_RBLhQYeFI~CLt|Y-BP#<-D?`(Xe@iCM zVoaHw#i%(she<-g#mLp%$lTJ^#LU&e(9qS`(#+M_!qLLn&B?&n(a6+ovJR7sg0rck zi=&%`0Zv7~7>y?{WzwJQ!K5_#8Rp@0V|q(PI=~z(5WK^&r^XdAHu(i;mGPR27~>*A!0!{eKRb1T4Fpt zZ*DrXTEn3_N{itc`vkp(ijBp0YA(zXSjHsQGAn%JlE?Z6sy}qi7cx6I8Z-#XGW`1g z*-7JhiVa5t12U@TcyK<0^V{`Hj0@Bx9DLauRwXc8y}@uRJ!_uB=eQYijyF6vFqyK< z%-?ogM&j-l)+;9`SY^%I`1ho>r-@r#gND*s$H^BAt|Z?ms9L)*K4FJPv+VSIr8}<# ztokf^(r5JLD3z5<2w3UgEv@WkexdQ|{o$H5AD{D1e{WZkRK%dhSpUW;eObDXFoWGf z*%yb}!rksQ{M4N-7M96W(QY>9yGLtgm0T4~UfX8-uL7zOeGzwPpCu>5tJ#a#HQCw!giM2a*GMLwiHCuwa%)#@ Tchh4AAn0*^|qd^f?qNatnNYtvn|mWHO!nhf!*>0JGxcrA+!fF6L&Y&KBlohDL6tlOHgd zF*&(TzQZIr*^t?>{^R~!P6h_Xr=Bj3Ar-gY%(nMF>>zP$a+ILpL0?yUr-K`tXa8W8 z2|1z_BB0JLzR|<6;KI>ZmO`zjX76%$LyOQ|SI(|1eYIdgv()^An689>F;(A-&U5qY zvrM}8`Sk7GcVZv?+V}p3jOFo93JgqWXoJzG`a=H|6>l?_h-S#mYGO03{?RgTVf2ev zD=cny6mODFw`F*C+Qa(7goEZ=`9c{V`D!xExbLjRz4DD(NEef$_{Bd>3ZETC7C5Vl zGJIC{FuyS4fL-3p{dS68tUBDL@<?LRQ*LEyR-Ob(6)4VRqU@JtgOO#cufPrVcG1D!6p#5F@qs-4Y5`rZ9&H{=asmRy{7_&cXwDc4-}oMYTR>Shm@)rLz5 zRPk?3ihIOj<^Aio!TeQ!E6+Zy=81igQ{UjnzO`T}(`$r2`HdT5MX?ptmJ$ z*UvRt3#8A<$g7^2y_rE^Pw*F&)Q1P2wojhM&M3gZD9~{AqwWEQmotmSwyxhefdL3S NUHw>H);T3K0RX39{@MTl diff --git a/WordPress/Resources/Images/reader-postaction-like-blue.png b/WordPress/Resources/Images/reader-postaction-like-blue.png index 937e991ea04c3fa0f2365541efffaedf21aae503..40257bb876ce559822de6d552cb73cd88e6a6d80 100644 GIT binary patch delta 565 zcmZ3+wTx@R4OLU!WCKGJ1#?S1LsLT&3qu_RBLhQYeFI~CLt|Y-BP#<-D?`(Xe@iCM zVoaHw#i%(she<-g+0@a+(aqe&#LU&e(9qS`(#+M_!qLLn&B?&n(a6+ovJR6BOp!BA zMZXx0Cog3(o9xddJ^34x;^b~7smX@Sj>@-BB4P~lPoe^khY^Na@`Ja_W0`Q~7l zSJl>_Z1N(J;YiuS<;)vccdCaLF&bzzH-?xB6dMPK*RVedOUR4#HIQbKRb*ab)p(=D zYg#<>Bc%mTzjx}fH}o-x8hAR);Xkq_C5p$WMo++>A?n}kHBB5Z1b7wduQDH5r4sc| zs^fH{nEX-=K_=cEj7yptD(tSfA8Dv{c;kJdXi|4lLdF^9pld8s=CVb}IDgII*fK}l zW2WH35cU<*CW}37ke=8nn6gt?SLQ*h>l;N8;oyLY?->#%d}7x0HhDPJL5AVTKZiX` zdzZDiNnVvwS$Cn0onsI4)F}sAwiWYx?vu-S$Qazmvv4FO#tXI(f$Ac delta 512 zcmV+b0{{J{3Z@E>*d;S9V=yr>AT~BGF*G$cHZd$9GB7bRFEBDMFg7hQG&(glIx;tr z{dAMu0V0!X0c(?X0xt+4cx`Y^O*%=F!2>`~e!15Cb8Tr2;kqLX+GAI{`zJ+yWVs zF#|y(w5VGD0004)Nkl;Du+RY`u(K`x2 zLC*=q>_F@|5NW^%Eh^~e0ATQQp(Q?hpcpqjL%H%U^5-ooX#N|MXk5ZHffdUbn2(sLX77p;jBK8o9i7BYa zcK|R*`GJ%rn(#^>4gg|*AYOr9Q$nMRY7G)sXu|^p-hoO=U_#q-ha_JQwD16^qyu7M zXx#vchKWrbAXN;iA%S{6 zQW^r%KpaA><r0BQk%00RKthkNm3Xi4h;00000c4YE0V$Jg0vI4eH9uHbp}?K{!K3LNGHyGBrk%ECL)L zLp4D}K}I(?G&V&rF)>9mIW|Q@I6*i=MnW(%K{7Q)lllQOlcfSSlTQL0llB53lZyfx zlQ9E9f1|I9nE(I+dQ52ntZo4h`)l$(wDcD7RgD`1YKNeQ0gf0Zp zAK=Ch6roVsMQLe8OLrA4R&n9VO^S;y6oRIL8y6ZEDyVU1KuObc=`9Q)>C9x_n|U+u zT{tvMlRLR*&VBdZHxs+rY+5>7#?ssj0fqoWe}Eyt5MT(<*batuFuYn0^YLEb0PwwA z2bE$j(F$;Yyv`{w$|NK=1wz zXv=C6m4>RDh=vEY9IHxT$+sf!>^@Ckn|0L#p{3ib*( z6Eyg)6wsmu+LE0Cj>Z&t9hgGk>#>wUf1J3?3*_?{g8vAd4->qoK7h*2P2f84CxXC9 zvMazi@L8ossKm`qNn-Fnfh)WS|5vdS{LM0T__XQ{~e*q5#`I{5y zE3#Q2C(xI)=1V34j-tLIA%Mo-V*>rrJ%l4kBA}2EpHc|0CC&3rQV1Zq9+H$+e*;M% z!0(l+bH8vaK+lj@odDY>0q<$Ug8PMMG|2()e0*+1bppKP-vAb9!vd(fj??DFWniA) z)5&NrBC9e1`(1qs_!6+xAxJv*0JsQzi7E{;5y^jzCBNmv&j;Wf@Fa?In2{`h8jh}6 zySvIkh9i3KJ>V+O6mIi-e<5-Lf1Ebc8$J885yIzdo&Za-(jX&2{&l|MG#1wc_^z?9 zJ1!L!_?*fRuqXd5&h<43{l!!EO(nGT8Kc+F7P>(*${bbg?QdK zpf$LZ3Td}(^Q$q<%@AM+Fa#I^3;~7!Lx8@vBftPKWtH=Tf(=&y0000<2SrXqu0mjf D#=nh% delta 879 zcmV-#1Cadl4E79=*d;S9V=yr>AT~BGF*G$cHZd$9GB7bRFEBDMFg7hQG&(glIx;tr z{dAMu0V0!X0c(?X0xt+4cx`Y^O*%=F!2>`~e!15Cb8Tr2;kqH_9k^Oy0o6;=LexZP}5E( za#^D@Ab|2V4}mib!Q3H`zz#vDLZ83dmH|OkCU`aj2y6ooPJgl!P@7Evf{5o*3!v80 z*Jld=O7)X9&UZtdHUJ2k{F@a3deaV|jc5FNb`0uDGk_>5Ua%cNKCJ-S8>IiPb?}OR zkU9WyQd`+%=r?*YG`h4-1v0Crn%idj<8! z4Zf)isLF;O944V7EegC0-9zBdrL6*g5g_cxVH_G%9Q-Gmj}ZK7tLp$-ZpNSyXj4Jp zbjRkQbI@v1XCe!sA{RSFiNSw|hItbHrDG-dlQUtQ$EPP4FcoEQMLL!BT!1E}AJAh# z{vHbSrK}g|5$J2%#AYba)Rz(f)b<_~=#QQu95x9+!4RKP0Qi#n`M?wal&)ESNyDnc z1OQR*RGI6An=xvJyzT(}hyXr7XSrT@L7g1*KEm&MbqCNW{dZ`y0=fv5Lg#7c<`VRX zzf;d>FQQv#0ROxD6z~OTrcRJ_ZWcNZt*IIY8Aa*8z$w2H!Our%0D7ikIm}2-e`=1d zdjEEn<1|O~-8;|~?kU0+_4$H-asWY%?v394d7Z%L8}0y$vW7uMLi(5aj#FE_A;9+r z`??j%q5@x28vwiMzrtgEK|+18$i8U_t$xR-%+UBzBl3UP7n%n%ZoLJoOU1 z?;F#0cqtW9Zu{=P#w<4nzyWXo8~_Kv0dN59wZ8%k0JiI!!O?ox{r~_9002ovPDHLk FV1kupgo6M8 diff --git a/WordPress/Resources/Images/reader-postaction-reblog-blue.png b/WordPress/Resources/Images/reader-postaction-reblog-blue.png index 027f0160b4497756759d7f876e5786e84d227f4d..818c87a90030816f0c783350d7e32ada76a9130a 100644 GIT binary patch delta 192 zcmey%@t0%54OLU!WCKGJ1#?S1LsLT&3qu_RBLhQYeFI~CLt|Y-BP#<-D?`(Xe@iCM zVoaHw#i%(she<-g(a6HZ)z!er#LU&e(9qS`(#+M_!qLLn&B?&n(a6+ovJR6BOpzf@ zMZXx0Cog5vpX|Y;H2E8o)Z`W>#mR=ujx2jGB+i>$#w^F;TK_R}@(kvSBJN+TE3G5> QIT?V!)78&qol`;+0GNk13IG5A delta 153 zcmey%@t0%54OL^^WCKG(1v4`}LlaXoGeaE(BLhPteFGpe(={})GBvX@GN1UjWbz$G zrO8>0*^|qd^f?qNatnNYtvn|mWHO!nhf!*>0JGxcr9cTwV>fd%Cv&&ScbH6|918;= yM{=?uvm?vmRhHW)modw+EdBJPc=8P9iz0%bZI~y$`9FgJ2s~Z=T-G@yGywqB$S}B)x7j`d!G(Nh>07%zIdIEGZ*dNbSF@34bF+x2PD z^P49f4!EcwbxGmk1g4801Qr!ZsYtzWXqu#4z-Ym++;H=x)(+L%yC2`ZS@=ypQ$&2@ z-1ny|A1qLP*q;P)4xA^_F=YK9)!(89Tf2!K+{@Rz7_1||Tawp6Q zW*7T#t|dNrUdeIR)XhiS4;;FGrp5g3$Ea0IPDi~P^6!07k+|>Wq55EEa|R9pN~J@d#5kp0@sa_>XMfpeE;jkGO9i&zo}Tf$Cvm1e72=3 z1=dbV%?ZLk3jE* z)&l#bHkX4KV>ma~|MA!)ULY$h#(e%IyH6++`@OOjJ&k@-z9u`N9UoR&Ic?r{`0w$= zi68E8y$EkgJP`e{dx``b3@24OFtDH?hj|~h4=~LC8ej0Rd1Vg+5O})!xvXFn delta 600 zcmcc5^?+-_4OL^^WCKG(1v4`}LlaXoGeaE(BLhPteFGpe(={})GBvX@GN1UjWbz$G zrO8>0*^|qd^f?qNatnNYtvn|mWHO!nhf!*>0JGxcrA($wX0DU(Fj+B~xdAE3$%f31 z^~aa>s4y@vUh;Ht45_&FX12B8VF!V>>(ip=H!}xbRFJx)aB%`tMg>QpC9e=~iAX>Z zOO}e>0ZxmynNxLKbZ*|0eSfZR^M8-UJ38Lh#2@=TL&Np*&*LkBE9?!Ab&|t3iXV#}3)_NMVRqdF>{-vqydD(Y8 zNK`;8j;ZGJGWCN$!kn}i&!3qj+m!CDQO+^%tA$7S0p+L8E*0;+CWs^~U!~4iq0ec^ z@`iPfnE1WOre{+h#8fOdTzIGOhbLz$+lR$Mr+gl;tA=_x@>FOH}_Pvb-X#52rH h3JfUdQ%^i28^iip@xT7Q;g4hh0#8>zmvv4FO#sGN_sReO From 25775a5cb1fbad77a2439044971049ed9170b877 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 01:16:05 -0800 Subject: [PATCH 16/38] Add tag button (sample text for now) --- WordPress/Classes/ReaderPostTableViewCell.m | 52 ++++++++++++++++-- .../Images/reader-postaction-tag.png | Bin 0 -> 1233 bytes .../Images/reader-postaction-tag@2x.png | Bin 0 -> 1451 bytes WordPress/WordPress.xcodeproj/project.pbxproj | 8 +++ 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 WordPress/Resources/Images/reader-postaction-tag.png create mode 100644 WordPress/Resources/Images/reader-postaction-tag@2x.png diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 6131329e704d..b41ffff26810 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -22,9 +22,10 @@ const CGFloat RPTVCHorizontalOuterPadding = 8.0f; const CGFloat RPTVCMetaViewHeight = 52.0f; const CGFloat RPTVAuthorViewHeight = 32.0f; -const CGFloat RPTVCVerticalPadding = 20.0f; +const CGFloat RPTVCVerticalPadding = 18.0f; const CGFloat RPTVCAvatarSize = 32.0f; const CGFloat RPTVCLineHeight = 1.0f; +const CGFloat RPTVCSmallButtonLeftPadding = 2; // Follow, tag // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -40,6 +41,7 @@ @interface ReaderPostTableViewCell() @property (nonatomic, strong) UILabel *snippetLabel; @property (nonatomic, strong) UILabel *timeLabel; @property (nonatomic, strong) UIButton *followButton; +@property (nonatomic, strong) UIButton *tagButton; @property (nonatomic, strong) UIView *metaView; @property (nonatomic, strong) CALayer *metaBorder; @@ -89,15 +91,25 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { desiredHeight += height; } + // Title desiredHeight += RPTVCVerticalPadding; desiredHeight += [post.postTitle sizeWithFont:[self titleFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; desiredHeight += RPTVCVerticalPadding; + // Post summary if ([post.summary length] > 0) { NSString *postSummary = [self prettySummaryForPost:post]; desiredHeight += [postSummary sizeWithFont:[self summaryFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; } + // Tag + NSString *tagName = [self tagNameForPost:post]; + if ([tagName length] > 0) { + desiredHeight += RPTVCVerticalPadding; + desiredHeight += [tagName sizeWithFont:[self summaryFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + } + + // Padding above and below the line desiredHeight += RPTVCVerticalPadding * 2; // Size of the meta view @@ -116,6 +128,12 @@ + (NSString *)prettySummaryForPost:(ReaderPost *)post { return prettySummary; } ++ (NSString *)tagNameForPost:(ReaderPost *)post { + // TODO: Get first tag from the post (not currently being stored) + return @"Sample Tag"; +} + + + (UIFont *)titleFont { return [UIFont fontWithName:@"Merriweather-Bold" size:21.0f]; } @@ -220,7 +238,7 @@ - (void)buildPostContent { self.titleLabel = [[UILabel alloc] init]; _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.font = [[self class] titleFont]; + _titleLabel.font = [ReaderPostTableViewCell titleFont]; _titleLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; _titleLabel.lineBreakMode = NSLineBreakByWordWrapping; _titleLabel.numberOfLines = 0; @@ -229,7 +247,7 @@ - (void)buildPostContent { self.snippetLabel = [[UILabel alloc] init]; _snippetLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _snippetLabel.backgroundColor = [UIColor clearColor]; - _snippetLabel.font = [[self class] summaryFont]; + _snippetLabel.font = [ReaderPostTableViewCell summaryFont]; _snippetLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; _snippetLabel.lineBreakMode = NSLineBreakByTruncatingTail; _snippetLabel.numberOfLines = 4; @@ -256,7 +274,6 @@ - (void)buildPostContent { self.followButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_followButton setSelected:[self.post.isFollowing boolValue]]; - //_followButton.layer.cornerRadius = 3.0f; _followButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; _followButton.backgroundColor = [UIColor clearColor]; _followButton.titleLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; @@ -264,10 +281,22 @@ - (void)buildPostContent { NSString *followedString = NSLocalizedString(@"Following", @"User is following the blog."); [_followButton setTitle:followString forState:UIControlStateNormal]; [_followButton setTitle:followedString forState:UIControlStateSelected]; + [_followButton setTitleEdgeInsets: UIEdgeInsetsMake(0, RPTVCSmallButtonLeftPadding, 0, 0)]; [_followButton setImage:[UIImage imageNamed:@"reader-postaction-follow"] forState:UIControlStateNormal]; [_followButton setImage:[UIImage imageNamed:@"reader-postaction-following"] forState:UIControlStateSelected]; [_followButton setTitleColor:[UIColor colorWithHexString:@"aaa"] forState:UIControlStateNormal]; [_byView addSubview:_followButton]; + + self.tagButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _tagButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + _tagButton.backgroundColor = [UIColor clearColor]; + _tagButton.titleLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; + NSString *tagName = [ReaderPostTableViewCell tagNameForPost:self.post]; + [_tagButton setTitle:tagName forState:UIControlStateNormal]; + [_tagButton setTitleEdgeInsets: UIEdgeInsetsMake(0, RPTVCSmallButtonLeftPadding, 0, 0)]; + [_tagButton setImage:[UIImage imageNamed:@"reader-postaction-tag"] forState:UIControlStateNormal]; + [_tagButton setTitleColor:[UIColor colorWithHexString:@"aaa"] forState:UIControlStateNormal]; + [_containerView addSubview:_tagButton]; } - (void)buildMetaContent { @@ -354,6 +383,16 @@ - (void)layoutSubviews { nextY += ceilf(height + RPTVCVerticalPadding); } + // Tag + if ([_tagButton.titleLabel.text length] > 0) { + height = ceil([_tagButton.titleLabel suggestedSizeForWidth:innerContentWidth].height); + _tagButton.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); + nextY += height + RPTVCVerticalPadding; + self.tagButton.hidden = NO; + } else { + self.tagButton.hidden = YES; + } + // Position the meta view and its subviews _metaView.frame = CGRectMake(0, nextY, contentWidth, RPTVCMetaViewHeight); _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCLineHeight); @@ -380,7 +419,7 @@ - (void)layoutSubviews { _timeLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCLineHeight, timeWidth, RPTVCControlButtonHeight); CGFloat sideBorderX = RPTVCHorizontalOuterPadding - 1; // Just to the left of the container - CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding + 1; // Just below it + CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding; // Just below it _sideBorderView.frame = CGRectMake(sideBorderX, 1, self.frame.size.width - sideBorderX * 2, sideBorderHeight); } @@ -392,6 +431,7 @@ - (void)prepareForReuse { _bylineLabel.text = nil; _titleLabel.text = nil; _snippetLabel.text = nil; + _timeLabel.text = nil; [self setHighlightedEffect:NO animated:NO]; } @@ -415,7 +455,7 @@ - (void)configureCell:(ReaderPost *)post { [self setAvatar:nil]; _titleLabel.text = [post.postTitle trim]; - _snippetLabel.text = [[self class] prettySummaryForPost:post]; + _snippetLabel.text = [ReaderPostTableViewCell prettySummaryForPost:post]; _bylineLabel.text = post.blogName; _timeLabel.text = [post prettyDateString]; diff --git a/WordPress/Resources/Images/reader-postaction-tag.png b/WordPress/Resources/Images/reader-postaction-tag.png new file mode 100644 index 0000000000000000000000000000000000000000..8d737ce0eb18c9864126c412c75ded0becf35a95 GIT binary patch literal 1233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf`)Hma%LWg zuL;)R>ucqiS6q^qmz?V9Vygr+LN7Bj#md0I(aF`#*v-V;!pYFk)!5O<$i&gr(9G1? z+{Mh<%@L;8B|o_|H#M&WrZ)wy*Tev)UQk-dEdbi=l3J8mmYU*Ll%J~r_On$c7PlBX zn;4oHn7RVZbHwfzh~5;OZZQVw#qJM%pkwqwF^d$_Fd<;_0Wsm}7RZ68{M0;PaxVg= z>pDlKISdSpE}kxqAr-fdOy28v*g&N9?Gi>OttJU2HMxb}MrjO&pX7R0ygGEDwcKIC zKBlCMtLZ0%OEiPRj!3C0HZAy5ke9l6l7)`!hA+I^iqHN1$eTZ_?d>L$ZI7i^@KtZR z#qxO0<UN zo~B*v_^Z7aoKRsCzhT$J{DChnVZ)(Xr>TE#GOzLe!0^pc@zs9z_|VX~hgO70EpQC- znfTp9VO^Gi%d6vkk8Nfy`?;*+ zoV+P?67Mq$`NMl&$f{f~Wxl=beL~Wu&AFY^6MX(=ocCDH-eGXqUB<^%UhDzeZzt1) zxsF0=oA{N5n*9x3WSQ@ko&7v#A0#?#f$ JWt~$(697%IthWFF literal 0 HcmV?d00001 diff --git a/WordPress/Resources/Images/reader-postaction-tag@2x.png b/WordPress/Resources/Images/reader-postaction-tag@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..548f0e116f1422a7ee6b970ee6d05549ee6ea9c0 GIT binary patch literal 1451 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%*vS|5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0TF_e;b>^+YV2raWa8**XlCkc z?qcTb<_Od4lAm0fo0?Yw)0=|O>w;4+C@tg`0Bv?jEy^rQO>ryA&s6~X*(wvaTO4tk z2i2Q`+bvEw_38s1qYsK%q?m>Y0h14i2~W2`4m{6td}vU$8FLy5y3b<8qsyoHj0sal1-iW>;M8 zc5&>`kXoqFcrkDHEn@@j(~EY$%c%I+D*tAO_W94}_I*CL#z3zBq|ss5X)@Z(+RTgY zGH;FQ{qno^QQ7Xba<|#c53rkj_VvAdZPLjUMG2mLR%Q-It>^Lyx?c3!!{XP#v?93k zu5_b(Xz1Tgmq&fsY#Gl&YPuL>|8Vfk_#v*rH0!OZ1-rAOfQcTn+2wWJ{5SJWK39J@ zaV&HLx1V@y%j6?pGo;p~{t~-+M(0e!RExRKv^ShQmi}PIHOB8+2Ch6d4L?{4Z6BLd zu+4uUP!VZ(E?420k^Ky%Jd=&AWjD5V@#f3!cy73$`~B^X*B?(SEWW7GAR6+uYA>%I zbA+AS$9(no+>yUy^}=l@pL}wm#ZE>%ar^CFpuA93V{&1OyzGW~UQ0Jk^jPw82ivW; zWs8DVicCBzx2Zsf@0Efy2g|IO*@3ICT1`r|ooUnc)1B3|tcuRA=~JShR=1QoHb% z{ce8wgYOy-COC+=F4VnQlifVGPUp3{2$x|0@x%EEUt>2IeYpQo{QyJsk=<;65>9%7 Oice2hKbLh*2~7Zma1%BF literal 0 HcmV?d00001 diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 7c4f02375278..62a63c1cfbb2 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -293,6 +293,8 @@ 462F4E0B18369F0B0028D2F8 /* BlogListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 462F4E0918369F0B0028D2F8 /* BlogListViewController.m */; }; 462F4E0E18369F300028D2F8 /* WPTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 462F4E0D18369F300028D2F8 /* WPTableViewCell.m */; }; 462F4E10183867AE0028D2F8 /* Merriweather-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */; }; + 46F8714B1838BB4E00BC149B /* reader-postaction-tag.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F871491838BB4E00BC149B /* reader-postaction-tag.png */; }; + 46F8714C1838BB4E00BC149B /* reader-postaction-tag@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */; }; 5D0077A7182AE9DF00F865DB /* ReaderMediaQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */; }; 5D119DA3176FBE040073D83A /* UIImageView+AFNetworkingExtra.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D119DA2176FBE040073D83A /* UIImageView+AFNetworkingExtra.m */; }; 5D1392A7157D4D92007D51B8 /* StatsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1392A6157D4D92007D51B8 /* StatsWebViewController.m */; }; @@ -1310,6 +1312,8 @@ 462F4E0C18369F300028D2F8 /* WPTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WPTableViewCell.h; sourceTree = ""; }; 462F4E0D18369F300028D2F8 /* WPTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WPTableViewCell.m; sourceTree = ""; }; 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Merriweather-Bold.ttf"; sourceTree = ""; }; + 46F871491838BB4E00BC149B /* reader-postaction-tag.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-tag.png"; path = "Resources/Images/reader-postaction-tag.png"; sourceTree = ""; }; + 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-tag@2x.png"; path = "Resources/Images/reader-postaction-tag@2x.png"; sourceTree = ""; }; 5D0077A5182AE9DF00F865DB /* ReaderMediaQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderMediaQueue.h; sourceTree = ""; }; 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderMediaQueue.m; sourceTree = ""; }; 5D119DA1176FBE040073D83A /* UIImageView+AFNetworkingExtra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworkingExtra.h"; sourceTree = ""; }; @@ -3357,6 +3361,8 @@ isa = PBXGroup; children = ( 462F4E0518369B370028D2F8 /* Tabs */, + 46F871491838BB4E00BC149B /* reader-postaction-tag.png */, + 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */, E14D65C117E08617007E3EA4 /* reader-postaction-comment-blue.png */, E14D65C217E08617007E3EA4 /* reader-postaction-comment-blue@2x.png */, E14D65BD17E08524007E3EA4 /* reader-postaction-reblog-blue.png */, @@ -4518,6 +4524,7 @@ 462F4E0118369B200028D2F8 /* icon-tab-notifications.png in Resources */, 374F18C415A5897500524ED0 /* sidebar_read.png in Resources */, 374F18C515A5897500524ED0 /* sidebar_read@2x.png in Resources */, + 46F8714C1838BB4E00BC149B /* reader-postaction-tag@2x.png in Resources */, 85ED54F317CC1A01006564AE /* icon-posts-editor-preview.png in Resources */, 374F18C615A5897500524ED0 /* sidebar_settings.png in Resources */, 374F18C715A5897500524ED0 /* sidebar_settings@2x.png in Resources */, @@ -4580,6 +4587,7 @@ 37B159F415AC7CEB00333C91 /* sidebar_cell_bg@2x.png in Resources */, 37B159F515AC7CEB00333C91 /* sidebar_cell_bg.png in Resources */, 30E9683C15AE4EB10047DD84 /* sidebar-logo.png in Resources */, + 46F8714B1838BB4E00BC149B /* reader-postaction-tag.png in Resources */, 30E9683D15AE4EB10047DD84 /* sidebar-logo@2x.png in Resources */, 30E9684115AE60B20047DD84 /* navbar_add.png in Resources */, E232E603182EA16200792CA0 /* icon-password-field.png in Resources */, From cc7ae0c4ec8858037a1a9931bd16cc59cee1519c Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 01:36:09 -0800 Subject: [PATCH 17/38] Move short date formatting to a category, and use it in main Reader list --- WordPress/Classes/NSDate+StringFormatting.h | 15 ++++++++++ WordPress/Classes/NSDate+StringFormatting.m | 30 +++++++++++++++++++ WordPress/Classes/ReaderComment.h | 2 -- WordPress/Classes/ReaderComment.m | 20 ------------- .../Classes/ReaderCommentTableViewCell.m | 3 +- WordPress/Classes/ReaderPostTableViewCell.m | 3 +- WordPress/WordPress.xcodeproj/project.pbxproj | 6 ++++ 7 files changed, 55 insertions(+), 24 deletions(-) create mode 100644 WordPress/Classes/NSDate+StringFormatting.h create mode 100644 WordPress/Classes/NSDate+StringFormatting.m diff --git a/WordPress/Classes/NSDate+StringFormatting.h b/WordPress/Classes/NSDate+StringFormatting.h new file mode 100644 index 000000000000..272d4fd205af --- /dev/null +++ b/WordPress/Classes/NSDate+StringFormatting.h @@ -0,0 +1,15 @@ +// +// NSDate+StringFormatting.h +// WordPress +// +// Created by Michael Johnston on 11/17/13. +// Copyright (c) 2013 WordPress. All rights reserved. +// + +#import + +@interface NSDate (StringFormatting) + +- (NSString *)shortString; + +@end diff --git a/WordPress/Classes/NSDate+StringFormatting.m b/WordPress/Classes/NSDate+StringFormatting.m new file mode 100644 index 000000000000..f5709da3eebe --- /dev/null +++ b/WordPress/Classes/NSDate+StringFormatting.m @@ -0,0 +1,30 @@ +// +// NSDate+StringFormatting.m +// WordPress +// +// Created by Michael Johnston on 11/17/13. +// Copyright (c) 2013 WordPress. All rights reserved. +// + +#import "NSDate+StringFormatting.h" + +@implementation NSDate (StringFormatting) + +- (NSString *)shortString { + NSString *shortString; + NSTimeInterval diff = [[NSDate date] timeIntervalSince1970] - [self timeIntervalSince1970]; + + if(diff < 60) { + shortString = [NSString stringWithFormat:@"%is", (int)diff]; + } else if(diff < 3600) { + shortString = [NSString stringWithFormat:@"%im", (int)floor(diff / 60)]; + } else if (diff < 86400) { + shortString = [NSString stringWithFormat:@"%ih", (int)floor(diff / 3600)]; + } else { + shortString = [NSString stringWithFormat:@"%id", (int)floor(diff / 86400)]; + } + + return shortString; +} + +@end diff --git a/WordPress/Classes/ReaderComment.h b/WordPress/Classes/ReaderComment.h index ffc0b13c72a2..6a3d1ea792a7 100644 --- a/WordPress/Classes/ReaderComment.h +++ b/WordPress/Classes/ReaderComment.h @@ -62,6 +62,4 @@ + (void)createOrUpdateWithDictionary:(NSDictionary *)dict forPost:(ReaderPost *)post withContext:(NSManagedObjectContext *)context; -- (NSString *)shortDate; - @end diff --git a/WordPress/Classes/ReaderComment.m b/WordPress/Classes/ReaderComment.m index 2103d5a09857..85de8aa5487c 100644 --- a/WordPress/Classes/ReaderComment.m +++ b/WordPress/Classes/ReaderComment.m @@ -185,24 +185,4 @@ - (void)updateFromDictionary:(NSDictionary *)dict { } - -- (NSString *)shortDate { - - NSString *str; - NSTimeInterval diff = [[NSDate date] timeIntervalSince1970] - [self.dateCreated timeIntervalSince1970]; - - if(diff < 60) { - str = [NSString stringWithFormat:@"%is", (int)diff]; - } else if(diff < 3600) { - str = [NSString stringWithFormat:@"%im", (int)floor(diff / 60)]; - } else if (diff < 86400) { - str = [NSString stringWithFormat:@"%ih", (int)floor(diff / 3600)]; - } else { - str = [NSString stringWithFormat:@"%id", (int)floor(diff / 86400)]; - } - - return str; - -} - @end diff --git a/WordPress/Classes/ReaderCommentTableViewCell.m b/WordPress/Classes/ReaderCommentTableViewCell.m index 8f4206a542fe..d7fd4936e8d3 100644 --- a/WordPress/Classes/ReaderCommentTableViewCell.m +++ b/WordPress/Classes/ReaderCommentTableViewCell.m @@ -11,6 +11,7 @@ #import "UIImageView+Gravatar.h" #import "WordPressAppDelegate.h" #import "WPWebViewController.h" +#import "NSDate+StringFormatting.h" #define RCTVCVerticalPadding 5.0f #define RCTVCIndentationWidth 10.0f @@ -197,7 +198,7 @@ - (void)configureCell:(ReaderComment *)comment { [self.contentView addSubview:self.cellImageView]; - _dateLabel.text = [comment shortDate]; + _dateLabel.text = [comment.dateCreated shortString]; _authorLabel.text = comment.author; [self.cellImageView setImageWithURL:[NSURL URLWithString:comment.authorAvatarURL] placeholderImage:[UIImage imageNamed:@"blavatar-wpcom.png"]]; diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index b41ffff26810..7ccc7f261cc4 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -16,6 +16,7 @@ #import "UILabel+SuggestSize.h" #import "WPAvatarSource.h" #import "ReaderButton.h" +#import "NSDate+StringFormatting.h" const CGFloat RPTVCAuthorPadding = 8.0f; const CGFloat RPTVCHorizontalInnerPadding = 12.0f; @@ -458,7 +459,7 @@ - (void)configureCell:(ReaderPost *)post { _snippetLabel.text = [ReaderPostTableViewCell prettySummaryForPost:post]; _bylineLabel.text = post.blogName; - _timeLabel.text = [post prettyDateString]; + _timeLabel.text = [post.dateCreated shortString]; self.showImage = NO; self.cellImageView.hidden = YES; diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 62a63c1cfbb2..eebda0c5e546 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -295,6 +295,7 @@ 462F4E10183867AE0028D2F8 /* Merriweather-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */; }; 46F8714B1838BB4E00BC149B /* reader-postaction-tag.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F871491838BB4E00BC149B /* reader-postaction-tag.png */; }; 46F8714C1838BB4E00BC149B /* reader-postaction-tag@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */; }; + 46F8714F1838C41600BC149B /* NSDate+StringFormatting.m in Sources */ = {isa = PBXBuildFile; fileRef = 46F8714E1838C41600BC149B /* NSDate+StringFormatting.m */; }; 5D0077A7182AE9DF00F865DB /* ReaderMediaQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */; }; 5D119DA3176FBE040073D83A /* UIImageView+AFNetworkingExtra.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D119DA2176FBE040073D83A /* UIImageView+AFNetworkingExtra.m */; }; 5D1392A7157D4D92007D51B8 /* StatsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1392A6157D4D92007D51B8 /* StatsWebViewController.m */; }; @@ -1314,6 +1315,8 @@ 462F4E0F183867AE0028D2F8 /* Merriweather-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Merriweather-Bold.ttf"; sourceTree = ""; }; 46F871491838BB4E00BC149B /* reader-postaction-tag.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-tag.png"; path = "Resources/Images/reader-postaction-tag.png"; sourceTree = ""; }; 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-tag@2x.png"; path = "Resources/Images/reader-postaction-tag@2x.png"; sourceTree = ""; }; + 46F8714D1838C41600BC149B /* NSDate+StringFormatting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+StringFormatting.h"; sourceTree = ""; }; + 46F8714E1838C41600BC149B /* NSDate+StringFormatting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+StringFormatting.m"; sourceTree = ""; }; 5D0077A5182AE9DF00F865DB /* ReaderMediaQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderMediaQueue.h; sourceTree = ""; }; 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderMediaQueue.m; sourceTree = ""; }; 5D119DA1176FBE040073D83A /* UIImageView+AFNetworkingExtra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworkingExtra.h"; sourceTree = ""; }; @@ -3795,6 +3798,8 @@ 5DF59C0A1770AE3A00171208 /* UILabel+SuggestSize.m */, 851734411798C64700A30E27 /* NSURL+Util.h */, 851734421798C64700A30E27 /* NSURL+Util.m */, + 46F8714D1838C41600BC149B /* NSDate+StringFormatting.h */, + 46F8714E1838C41600BC149B /* NSDate+StringFormatting.m */, ); name = Categories; sourceTree = ""; @@ -5076,6 +5081,7 @@ 031663070FFB151A0045D052 /* PostTableViewCell.m in Sources */, 031666AE0FFC3E130045D052 /* CommentTableViewCell.m in Sources */, 03958062100D6CFC00850742 /* WPLabel.m in Sources */, + 46F8714F1838C41600BC149B /* NSDate+StringFormatting.m in Sources */, 296526FE105810E100597FA3 /* NSString+Helpers.m in Sources */, 2994EEEE10DF0FCD008336A6 /* ReplyToCommentViewController.m in Sources */, 2906F812110CDA8900169D56 /* EditCommentViewController.m in Sources */, From bfc46bd8799bb478d25aad6d7a9061f5f365ba24 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 02:14:51 -0800 Subject: [PATCH 18/38] Adjust image height ratio and make it a const --- WordPress/Classes/ReaderPostTableViewCell.h | 2 ++ WordPress/Classes/ReaderPostTableViewCell.m | 5 +++-- WordPress/Classes/ReaderPostsViewController.m | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.h b/WordPress/Classes/ReaderPostTableViewCell.h index 7ff914e30ac4..8069f29c9ab6 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.h +++ b/WordPress/Classes/ReaderPostTableViewCell.h @@ -20,4 +20,6 @@ - (void)setFeaturedImage:(UIImage *)image; - (void)setAvatar:(UIImage *)avatar; +extern CGFloat const RPTVCMaxImageHeightPercentage; + @end diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 7ccc7f261cc4..5ff7a5a0182e 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -27,6 +27,7 @@ const CGFloat RPTVCAvatarSize = 32.0f; const CGFloat RPTVCLineHeight = 1.0f; const CGFloat RPTVCSmallButtonLeftPadding = 2; // Follow, tag +const CGFloat RPTVCMaxImageHeightPercentage = 0.59f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -88,7 +89,7 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { // Are we showing an image? What size should it be? if (post.featuredImageURL) { - CGFloat height = ceilf((contentWidth * 0.66f)); + CGFloat height = ceilf((contentWidth * RPTVCMaxImageHeightPercentage)); desiredHeight += height; } @@ -366,7 +367,7 @@ - (void)layoutSubviews { // Are we showing an image? What size should it be? if (_showImage) { - height = ceilf(contentWidth * 0.66f); + height = ceilf(contentWidth * RPTVCMaxImageHeightPercentage); self.cellImageView.frame = CGRectMake(0, nextY, contentWidth, height); nextY += height; } diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 6037bb6d6f05..f6fc1abdae8d 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -105,7 +105,7 @@ - (void)viewDidLoad { maxWidth = MAX(self.tableView.bounds.size.width, self.tableView.bounds.size.height); } maxWidth -= 20.f; // Container frame - CGFloat maxHeight = maxWidth * 0.66f; + CGFloat maxHeight = maxWidth * RPTVCMaxImageHeightPercentage; _featuredImageSource = [[WPTableImageSource alloc] initWithMaxSize:CGSizeMake(maxWidth, maxHeight)]; _featuredImageSource.delegate = self; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; @@ -606,7 +606,7 @@ - (void)setImageForPost:(ReaderPost *)post forCell:(ReaderPostTableViewCell *)ce CGSize imageSize = cell.cellImageView.bounds.size; if (CGSizeEqualToSize(imageSize, CGSizeZero)) { imageSize.width = self.tableView.bounds.size.width; - imageSize.height = round(imageSize.width * 0.66f); + imageSize.height = round(imageSize.width * RPTVCMaxImageHeightPercentage); } UIImage *image = [_featuredImageSource imageForURL:imageURL withSize:imageSize]; if (image) { From 3ba885adc40762277530f9458434c5bcbdae7d98 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 10:42:33 -0800 Subject: [PATCH 19/38] Refactor cells to decouple actions for better MVC separation --- WordPress/Classes/ReaderPostTableViewCell.h | 10 ++ WordPress/Classes/ReaderPostTableViewCell.m | 28 ++-- WordPress/Classes/ReaderPostsViewController.m | 154 ++++++++++-------- WordPress/Classes/ReaderTableViewCell.h | 1 - 4 files changed, 106 insertions(+), 87 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.h b/WordPress/Classes/ReaderPostTableViewCell.h index 8069f29c9ab6..caa577e3ae43 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.h +++ b/WordPress/Classes/ReaderPostTableViewCell.h @@ -14,12 +14,22 @@ @property (nonatomic, strong) UIImageView *avatarImageView; + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width; ++ (ReaderPostTableViewCell *)cellForSubview:(UIView *)subview; - (void)configureCell:(ReaderPost *)post; - (void)setReblogTarget:(id)target action:(SEL)selector; - (void)setFeaturedImage:(UIImage *)image; - (void)setAvatar:(UIImage *)avatar; +@property (nonatomic, strong) ReaderPost *post; +@property (nonatomic, strong) UIButton *followButton; +@property (nonatomic, strong) UIButton *tagButton; +@property (nonatomic, strong) UIButton *likeButton; +@property (nonatomic, strong) UIButton *reblogButton; +@property (nonatomic, strong) UIButton *commentButton; + extern CGFloat const RPTVCMaxImageHeightPercentage; +- (void)updateControlBar; + @end diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 5ff7a5a0182e..6d6e71dd51ed 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -37,31 +37,19 @@ @interface ReaderPostTableViewCell() -@property (nonatomic, strong) ReaderPost *post; @property (nonatomic, strong) UIView *containerView; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UILabel *snippetLabel; @property (nonatomic, strong) UILabel *timeLabel; -@property (nonatomic, strong) UIButton *followButton; -@property (nonatomic, strong) UIButton *tagButton; @property (nonatomic, strong) UIView *metaView; @property (nonatomic, strong) CALayer *metaBorder; - @property (nonatomic, strong) UIView *byView; @property (nonatomic, strong) UILabel *bylineLabel; - @property (nonatomic, strong) UIView *controlView; -@property (nonatomic, strong) UIButton *likeButton; -@property (nonatomic, strong) UIButton *reblogButton; -@property (nonatomic, strong) UIButton *commentButton; @property (nonatomic, assign) BOOL showImage; -- (void)buildPostContent; -- (void)buildMetaContent; -- (void)handleLikeButtonTapped:(id)sender; - @end @implementation ReaderPostTableViewCell { @@ -135,7 +123,6 @@ + (NSString *)tagNameForPost:(ReaderPost *)post { return @"Sample Tag"; } - + (UIFont *)titleFont { return [UIFont fontWithName:@"Merriweather-Bold" size:21.0f]; } @@ -144,6 +131,18 @@ + (UIFont *)summaryFont { return [UIFont fontWithName:@"OpenSans" size:14.0f]; } ++ (ReaderPostTableViewCell *)cellForSubview:(UIView *)subview { + UIView *view = subview; + while (![view isKindOfClass:self]) { + view = (UIView *)view.superview; + } + + if (view == subview) + return nil; + + return (ReaderPostTableViewCell *)view; +} + #pragma mark - Lifecycle Methods @@ -325,7 +324,6 @@ - (void)buildMetaContent { _likeButton.backgroundColor = [UIColor whiteColor]; [_likeButton setImage:[UIImage imageNamed:@"reader-postaction-like-blue"] forState:UIControlStateNormal]; [_likeButton setImage:[UIImage imageNamed:@"reader-postaction-like-active"] forState:UIControlStateSelected]; - [_likeButton addTarget:self action:@selector(handleLikeButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; [_metaView addSubview:_likeButton]; self.reblogButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; @@ -522,7 +520,7 @@ - (void)updateControlBar { _reblogButton.userInteractionEnabled = !_reblogButton.selected; } -- (void)handleLikeButtonTapped:(id)sender { +- (void)likeAction:(id)sender { [self.post toggleLikedWithSuccess:^{ if ([self.post.isLiked boolValue]) { diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index f6fc1abdae8d..b24f5a754af8 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -44,21 +44,11 @@ @interface ReaderPostsViewController () Date: Sun, 17 Nov 2013 10:44:20 -0800 Subject: [PATCH 20/38] Better variable names --- WordPress/Classes/ReaderPostsViewController.m | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index b24f5a754af8..384f3243f2eb 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -104,29 +104,29 @@ - (void)viewDidLoad { // Topics button UIBarButtonItem *button = nil; if (IS_IOS7) { - UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; - [btn setImage:[UIImage imageNamed:@"icon-reader-topics"] forState:UIControlStateNormal]; - [btn setImage:[UIImage imageNamed:@"icon-reader-topics-active"] forState:UIControlStateHighlighted]; + UIButton *topicsButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [topicsButton setImage:[UIImage imageNamed:@"icon-reader-topics"] forState:UIControlStateNormal]; + [topicsButton setImage:[UIImage imageNamed:@"icon-reader-topics-active"] forState:UIControlStateHighlighted]; CGSize imageSize = [UIImage imageNamed:@"icon-reader-topics"].size; - btn.frame = CGRectMake(0.0, 0.0, imageSize.width, imageSize.height); + topicsButton.frame = CGRectMake(0.0, 0.0, imageSize.width, imageSize.height); - [btn addTarget:self action:@selector(topicsAction:) forControlEvents:UIControlEventTouchUpInside]; - button = [[UIBarButtonItem alloc] initWithCustomView:btn]; + [topicsButton addTarget:self action:@selector(topicsAction:) forControlEvents:UIControlEventTouchUpInside]; + button = [[UIBarButtonItem alloc] initWithCustomView:topicsButton]; } else { - UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; - [btn setImage:[UIImage imageNamed:@"navbar_read"] forState:UIControlStateNormal]; + UIButton *readButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [readButton setImage:[UIImage imageNamed:@"navbar_read"] forState:UIControlStateNormal]; UIImage *backgroundImage = [[UIImage imageNamed:@"navbar_button_bg"] stretchableImageWithLeftCapWidth:4 topCapHeight:0]; - [btn setBackgroundImage:backgroundImage forState:UIControlStateNormal]; + [readButton setBackgroundImage:backgroundImage forState:UIControlStateNormal]; backgroundImage = [[UIImage imageNamed:@"navbar_button_bg_active"] stretchableImageWithLeftCapWidth:4 topCapHeight:0]; - [btn setBackgroundImage:backgroundImage forState:UIControlStateHighlighted]; + [readButton setBackgroundImage:backgroundImage forState:UIControlStateHighlighted]; - btn.frame = CGRectMake(0.0f, 0.0f, 44.0f, 30.0f); + readButton.frame = CGRectMake(0.0f, 0.0f, 44.0f, 30.0f); - [btn addTarget:self action:@selector(topicsAction:) forControlEvents:UIControlEventTouchUpInside]; - button = [[UIBarButtonItem alloc] initWithCustomView:btn]; + [readButton addTarget:self action:@selector(topicsAction:) forControlEvents:UIControlEventTouchUpInside]; + button = [[UIBarButtonItem alloc] initWithCustomView:readButton]; } [button setAccessibilityLabel:NSLocalizedString(@"Topics", @"")]; From f403cffca66294080eb5bea1c5885f86a2cb3596 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 11:23:26 -0800 Subject: [PATCH 21/38] Hook up follow button --- WordPress/Classes/ReaderPostTableViewCell.h | 1 - WordPress/Classes/ReaderPostTableViewCell.m | 20 ++++++++----------- WordPress/Classes/ReaderPostsViewController.m | 15 ++++++++++++++ 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.h b/WordPress/Classes/ReaderPostTableViewCell.h index caa577e3ae43..8f44305a2ee1 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.h +++ b/WordPress/Classes/ReaderPostTableViewCell.h @@ -17,7 +17,6 @@ + (ReaderPostTableViewCell *)cellForSubview:(UIView *)subview; - (void)configureCell:(ReaderPost *)post; -- (void)setReblogTarget:(id)target action:(SEL)selector; - (void)setFeaturedImage:(UIImage *)image; - (void)setAvatar:(UIImage *)avatar; diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 6d6e71dd51ed..062d3bb52e4e 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -22,7 +22,7 @@ const CGFloat RPTVCHorizontalInnerPadding = 12.0f; const CGFloat RPTVCHorizontalOuterPadding = 8.0f; const CGFloat RPTVCMetaViewHeight = 52.0f; -const CGFloat RPTVAuthorViewHeight = 32.0f; +const CGFloat RPTVCAuthorViewHeight = 32.0f; const CGFloat RPTVCVerticalPadding = 18.0f; const CGFloat RPTVCAvatarSize = 32.0f; const CGFloat RPTVCLineHeight = 1.0f; @@ -72,7 +72,7 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { } desiredHeight += RPTVCAuthorPadding; - desiredHeight += RPTVAuthorViewHeight; + desiredHeight += RPTVCAuthorViewHeight; desiredHeight += RPTVCAuthorPadding; // Are we showing an image? What size should it be? @@ -273,7 +273,7 @@ - (void)buildPostContent { _bylineLabel.textColor = [UIColor colorWithHexString:@"333"]; [_byView addSubview:_bylineLabel]; - self.followButton = [UIButton buttonWithType:UIButtonTypeCustom]; + self.followButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; [_followButton setSelected:[self.post.isFollowing boolValue]]; _followButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; _followButton.backgroundColor = [UIColor clearColor]; @@ -288,7 +288,7 @@ - (void)buildPostContent { [_followButton setTitleColor:[UIColor colorWithHexString:@"aaa"] forState:UIControlStateNormal]; [_byView addSubview:_followButton]; - self.tagButton = [UIButton buttonWithType:UIButtonTypeCustom]; + self.tagButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; _tagButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; _tagButton.backgroundColor = [UIColor clearColor]; _tagButton.titleLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; @@ -353,15 +353,16 @@ - (void)layoutSubviews { CGRect frame = CGRectMake(leftPadding, 0, contentWidth, self.frame.size.height - RPTVCVerticalPadding); _containerView.frame = frame; - _byView.frame = CGRectMake(0, 0, contentWidth, RPTVAuthorViewHeight); + _byView.frame = CGRectMake(0, 0, contentWidth, RPTVCAuthorViewHeight + RPTVCAuthorPadding * 2); CGFloat bylineX = RPTVCAvatarSize + RPTVCAuthorPadding + RPTVCHorizontalInnerPadding; _bylineLabel.frame = CGRectMake(bylineX, RPTVCAuthorPadding - 2, contentWidth - bylineX, 18); CGFloat followX = bylineX - 4; // Fudge factor for image alignment CGFloat followY = RPTVCAuthorPadding + _bylineLabel.frame.size.height - 2; - _followButton.frame = CGRectMake(followX, followY, contentWidth - bylineX, 18); + height = ceil([_followButton.titleLabel suggestedSizeForWidth:innerContentWidth].height); + _followButton.frame = CGRectMake(followX, followY, contentWidth - bylineX, height); - nextY += RPTVAuthorViewHeight + RPTVCAuthorPadding; + nextY += RPTVCAuthorViewHeight + RPTVCAuthorPadding; // Are we showing an image? What size should it be? if (_showImage) { @@ -443,10 +444,6 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N [self updateControlBar]; } -- (void)setReblogTarget:(id)target action:(SEL)selector { - [_reblogButton addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; -} - - (void)configureCell:(ReaderPost *)post { self.post = post; @@ -521,7 +518,6 @@ - (void)updateControlBar { } - (void)likeAction:(id)sender { - [self.post toggleLikedWithSuccess:^{ if ([self.post.isLiked boolValue]) { [WPMobileStats trackEventForWPCom:StatsEventReaderLikedPost]; diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 384f3243f2eb..c0c9c765aaa6 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -439,6 +439,21 @@ - (void)topicsAction:(id)sender { } } +- (void)followAction:(id)sender { + UIButton *followButton = (UIButton *)sender; + ReaderPostTableViewCell *cell = [ReaderPostTableViewCell cellForSubview:sender]; + ReaderPost *post = cell.post; + + followButton.selected = ![post.isFollowing boolValue]; // Set it optimistically + [cell setNeedsLayout]; + [post toggleFollowingWithSuccess:^{ + } failure:^(NSError *error) { + DDLogError(@"Error Following Blog : %@", [error localizedDescription]); + [followButton setSelected:[post.isFollowing boolValue]]; + [cell setNeedsLayout]; + }]; +} + - (void)commentAction:(id)sender { // TODO: allow commenting } From 38124e0167d072337218ff04e8c4394b7cb41c91 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 11:43:23 -0800 Subject: [PATCH 22/38] Add clock icon to timestamp --- WordPress/Classes/ReaderPostTableViewCell.h | 1 + WordPress/Classes/ReaderPostTableViewCell.m | 22 ++++++++---------- .../Images/reader-postaction-time.png | Bin 0 -> 1349 bytes .../Images/reader-postaction-time@2x.png | Bin 0 -> 1812 bytes WordPress/WordPress.xcodeproj/project.pbxproj | 8 +++++++ 5 files changed, 19 insertions(+), 12 deletions(-) create mode 100644 WordPress/Resources/Images/reader-postaction-time.png create mode 100644 WordPress/Resources/Images/reader-postaction-time@2x.png diff --git a/WordPress/Classes/ReaderPostTableViewCell.h b/WordPress/Classes/ReaderPostTableViewCell.h index 8f44305a2ee1..cb8a14a9de9c 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.h +++ b/WordPress/Classes/ReaderPostTableViewCell.h @@ -26,6 +26,7 @@ @property (nonatomic, strong) UIButton *likeButton; @property (nonatomic, strong) UIButton *reblogButton; @property (nonatomic, strong) UIButton *commentButton; +@property (nonatomic, strong) UIButton *timeButton; extern CGFloat const RPTVCMaxImageHeightPercentage; diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 062d3bb52e4e..3bcff37a79f0 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -40,7 +40,6 @@ @interface ReaderPostTableViewCell() @property (nonatomic, strong) UIView *containerView; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UILabel *snippetLabel; -@property (nonatomic, strong) UILabel *timeLabel; @property (nonatomic, strong) UIView *metaView; @property (nonatomic, strong) CALayer *metaBorder; @@ -310,14 +309,14 @@ - (void)buildMetaContent { _metaBorder.backgroundColor = [[UIColor colorWithHexString:@"f1f1f1"] CGColor]; [_metaView.layer addSublayer:_metaBorder]; - self.timeLabel = [[UILabel alloc] init]; - _timeLabel.backgroundColor = [UIColor clearColor]; - _timeLabel.numberOfLines = 1; - _timeLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; - _timeLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; - _timeLabel.adjustsFontSizeToFitWidth = NO; - _timeLabel.textColor = [UIColor colorWithHexString:@"aaa"]; - [_metaView addSubview:_timeLabel]; + self.timeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _timeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + _timeButton.backgroundColor = [UIColor clearColor]; + _timeButton.titleLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; + [_timeButton setTitleEdgeInsets: UIEdgeInsetsMake(0, RPTVCSmallButtonLeftPadding, 0, 0)]; + [_timeButton setImage:[UIImage imageNamed:@"reader-postaction-time"] forState:UIControlStateNormal]; + [_timeButton setTitleColor:[UIColor colorWithHexString:@"aaa"] forState:UIControlStateNormal]; + [_metaView addSubview:_timeButton]; self.likeButton = [ReaderButton buttonWithType:UIButtonTypeCustom]; _likeButton.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin; @@ -417,7 +416,7 @@ - (void)layoutSubviews { _reblogButton.frame = CGRectMake(buttonX, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); CGFloat timeWidth = contentWidth - _reblogButton.frame.origin.x; - _timeLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCLineHeight, timeWidth, RPTVCControlButtonHeight); + _timeButton.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCLineHeight, timeWidth, RPTVCControlButtonHeight); CGFloat sideBorderX = RPTVCHorizontalOuterPadding - 1; // Just to the left of the container CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding; // Just below it @@ -432,7 +431,6 @@ - (void)prepareForReuse { _bylineLabel.text = nil; _titleLabel.text = nil; _snippetLabel.text = nil; - _timeLabel.text = nil; [self setHighlightedEffect:NO animated:NO]; } @@ -455,7 +453,7 @@ - (void)configureCell:(ReaderPost *)post { _snippetLabel.text = [ReaderPostTableViewCell prettySummaryForPost:post]; _bylineLabel.text = post.blogName; - _timeLabel.text = [post.dateCreated shortString]; + [_timeButton setTitle:[post.dateCreated shortString] forState:UIControlStateNormal]; self.showImage = NO; self.cellImageView.hidden = YES; diff --git a/WordPress/Resources/Images/reader-postaction-time.png b/WordPress/Resources/Images/reader-postaction-time.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4425624b86e43ef80121d282e1bdabf91a4771 GIT binary patch literal 1349 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xd_B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf`)Hma%LWg zuL;)R>ucqiS6q^qmz?V9Vygr+LN7Bj#mdsu($LAx)!D?{(a6xy)!5O<$i&gr(9G1? z+{Mh<%@L;8B|o_|H#M&WrZ)wl*9E6uP+G_>0NU)5T9jFqn&MWJpQ`}&vsET;w>aW7 z52`l>w_BWW>eUB2MjsTjNHGl)0wy026P|8?9C*r4%>yR)B4E0H_vOeU1_s6*o-U3d z6}OW9{QqyytlBW~6LySRmT{G8h=0cGv zwX83gw$C=tf3~msyPxdghV=9EBLDvS`r4kK|9s7of}gBknV3CzUQC+p@c;eZ^7nBf zX5ufnxVi5?dh+DY|M&OpQ^LIti5eRkdU$!w`|qGUTQKUDm2CE`HsRhgn5M zMURVv@i}X6w@Mbi~2l&Ohx~5vTF)H|~si|ciaNuICTFkGZ(vfn4 zcf#hzN8P-;0splaP5-mAC2?F>y8ENr z)8+p2o0zzsDAg)l=jpiVn90!5&v5jgho@)bqRDMDJ3|-*5*WPBZ96etsLBsiuz9-r KxvXl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0ryA&s6~X*(wvaTTF49 z2i2Q`+bw1|_38s1qYsK%q?m>Y0h14i2~W2`4m{7U(r=5EaW`E!m+6#xJKtXW^~$A|m>i_ZQ0 zSNFWU?zy?A(ae<1H<#p0yFI5tX(4~pL4|I ?Cm)Or^7h_m{xKOinCg9Rn7ezI@EyiH0k7Xzc&;@zCs^*_ zKXP2%pcF@ZU3F4G;zkg z122UFHAE%>bE5t6-&QL_ZZ*3{8|f_j))sx6p~~pqTNTHN9xjQSZ<<-k^sU=t^Wb9z zpK?dWr#ia`jnnD%KTT(MZa=8m>U6NiE}os|Qm0r$fA__g0;~!)7kb?HbKQ9+`{KWz zShsGA<7`*%7q4GO_wLOPUKtWU#p~%}$vNVMy>7*=+YESa_0CZeRaKDTTR&sYoD{3M z?=~Jx=y=AZv@mUBgoatu2Pe~>S^8cK*J?RquV!uaUh;Kf4*yF1O%M1hE_O%jmbvb{ zp)kiQHf;6Rs{yW#+2*zNs-rinKR+c+YuNyyzn5J?}O-+r% z@_dKkMy8C{hU>3KYfkXe|G32Yt2FFxv#_VkDB^XIJ_7+4;#&yr{i?sqxF z;i2^m^stglvcRR?me_~5e^k#`#*7590cVlB?Y(%|e*%f1%v-K{V z1~Yx`UwFuA6Ug*c-SwS?P$84c<-V6%5}WuRtGq4y{WYhwv1FIBglyErF3*p38{C(4 zd`?i!c+7q!v}a-4)48IeqU-jYV=DQPVm8}9nSrYzyRxH#zbAw{;q2TKP4i~Wnk6PN z^^7+|<-wOFaaUe{eH-EY>8|gl4sp4ipAPYTn6*mni}aecYww1Ig_(r}I5vItR_ZoA zIEf)Iy3*A}{c-SzCO+R&-}jg;DavJDYyI9&^9RSKmFaGxf>%oyFxyu%hMG$s4D;Le z?3s6&97(la@g(%T(T0wGLngb=OixuM{Ff%JVlSFjQ(S-c8Oxb% c4fRYs43ZiVvIphgbb{(BPgg&ebxsLQ08&`Jg8%>k literal 0 HcmV?d00001 diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index eebda0c5e546..23c499910b5b 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -296,6 +296,8 @@ 46F8714B1838BB4E00BC149B /* reader-postaction-tag.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F871491838BB4E00BC149B /* reader-postaction-tag.png */; }; 46F8714C1838BB4E00BC149B /* reader-postaction-tag@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */; }; 46F8714F1838C41600BC149B /* NSDate+StringFormatting.m in Sources */ = {isa = PBXBuildFile; fileRef = 46F8714E1838C41600BC149B /* NSDate+StringFormatting.m */; }; + 46F871521839528C00BC149B /* reader-postaction-time.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F871501839528C00BC149B /* reader-postaction-time.png */; }; + 46F871531839528C00BC149B /* reader-postaction-time@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 46F871511839528C00BC149B /* reader-postaction-time@2x.png */; }; 5D0077A7182AE9DF00F865DB /* ReaderMediaQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */; }; 5D119DA3176FBE040073D83A /* UIImageView+AFNetworkingExtra.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D119DA2176FBE040073D83A /* UIImageView+AFNetworkingExtra.m */; }; 5D1392A7157D4D92007D51B8 /* StatsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1392A6157D4D92007D51B8 /* StatsWebViewController.m */; }; @@ -1317,6 +1319,8 @@ 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-tag@2x.png"; path = "Resources/Images/reader-postaction-tag@2x.png"; sourceTree = ""; }; 46F8714D1838C41600BC149B /* NSDate+StringFormatting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+StringFormatting.h"; sourceTree = ""; }; 46F8714E1838C41600BC149B /* NSDate+StringFormatting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+StringFormatting.m"; sourceTree = ""; }; + 46F871501839528C00BC149B /* reader-postaction-time.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-time.png"; path = "Resources/Images/reader-postaction-time.png"; sourceTree = ""; }; + 46F871511839528C00BC149B /* reader-postaction-time@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-time@2x.png"; path = "Resources/Images/reader-postaction-time@2x.png"; sourceTree = ""; }; 5D0077A5182AE9DF00F865DB /* ReaderMediaQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderMediaQueue.h; sourceTree = ""; }; 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderMediaQueue.m; sourceTree = ""; }; 5D119DA1176FBE040073D83A /* UIImageView+AFNetworkingExtra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworkingExtra.h"; sourceTree = ""; }; @@ -3364,6 +3368,8 @@ isa = PBXGroup; children = ( 462F4E0518369B370028D2F8 /* Tabs */, + 46F871501839528C00BC149B /* reader-postaction-time.png */, + 46F871511839528C00BC149B /* reader-postaction-time@2x.png */, 46F871491838BB4E00BC149B /* reader-postaction-tag.png */, 46F8714A1838BB4E00BC149B /* reader-postaction-tag@2x.png */, E14D65C117E08617007E3EA4 /* reader-postaction-comment-blue.png */, @@ -4465,6 +4471,7 @@ 857F55CF17CEC5E100E154E1 /* keyboardButtonHighlighted-ios7@2x.png in Resources */, E18165FD14E4428B006CE885 /* loader.html in Resources */, E128566415103A3600406BC9 /* keyboardButtoniPad@2x.png in Resources */, + 46F871531839528C00BC149B /* reader-postaction-time@2x.png in Resources */, E128566515103A3600406BC9 /* keyboardButtoniPadHighlighted@2x.png in Resources */, 30811743151057880028A15E /* Default-Portrait@2x.png in Resources */, 30811744151057880028A15E /* Default-Landscape@2x.png in Resources */, @@ -4689,6 +4696,7 @@ 5D15F4DD15B8C43E001B14EA /* toolbarBoldHighlighted@2x.png in Resources */, 5D15F4DE15B8C43E001B14EA /* toolbarBoldiPad.png in Resources */, 5D15F4DF15B8C43E001B14EA /* toolbarBoldiPad@2x.png in Resources */, + 46F871521839528C00BC149B /* reader-postaction-time.png in Resources */, 5D15F4E015B8C43E001B14EA /* toolbarCodeHighlighted.png in Resources */, 5D15F4E115B8C43E001B14EA /* toolbarCodeHighlighted@2x.png in Resources */, 5D15F4E215B8C43E001B14EA /* toolbarCodeiPad.png in Resources */, From e92f761fa644da796ba1efc796ae89cf18e26c05 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 11:49:03 -0800 Subject: [PATCH 23/38] Add title border when there's no image --- WordPress/Classes/ReaderPostTableViewCell.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 3bcff37a79f0..1b70f784e72d 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -39,6 +39,7 @@ @interface ReaderPostTableViewCell() @property (nonatomic, strong) UIView *containerView; @property (nonatomic, strong) UILabel *titleLabel; +@property (nonatomic, strong) CALayer *titleBorder; @property (nonatomic, strong) UILabel *snippetLabel; @property (nonatomic, strong) UIView *metaView; @@ -243,6 +244,10 @@ - (void)buildPostContent { _titleLabel.lineBreakMode = NSLineBreakByWordWrapping; _titleLabel.numberOfLines = 0; [_containerView addSubview:_titleLabel]; + + self.titleBorder = [[CALayer alloc] init]; + _titleBorder.backgroundColor = [[UIColor colorWithHexString:@"f1f1f1"] CGColor]; + [_containerView.layer addSublayer:_titleBorder]; self.snippetLabel = [[UILabel alloc] init]; _snippetLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; @@ -365,9 +370,13 @@ - (void)layoutSubviews { // Are we showing an image? What size should it be? if (_showImage) { + _titleBorder.hidden = YES; height = ceilf(contentWidth * RPTVCMaxImageHeightPercentage); self.cellImageView.frame = CGRectMake(0, nextY, contentWidth, height); nextY += height; + } else { + _titleBorder.hidden = NO; + _titleBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCLineHeight); } // Position the title From 2b98cdd2b1b824afc1fdd5b34e7d9d70f7c9eae0 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 12:28:19 -0800 Subject: [PATCH 24/38] Support UILabel attributedText size suggestion --- WordPress/Classes/UILabel+SuggestSize.h | 3 ++- WordPress/Classes/UILabel+SuggestSize.m | 16 +++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/WordPress/Classes/UILabel+SuggestSize.h b/WordPress/Classes/UILabel+SuggestSize.h index e3811feee887..2f2542a90e05 100644 --- a/WordPress/Classes/UILabel+SuggestSize.h +++ b/WordPress/Classes/UILabel+SuggestSize.h @@ -11,6 +11,7 @@ @interface UILabel (SuggestSize) - (CGSize)suggestedSizeForWidth:(CGFloat)width; -- (CGSize)suggestSizeForString:(NSString *)string atWidth:(CGFloat)width; +- (CGSize)suggestSizeForAttributedString:(NSAttributedString *)string width:(CGFloat)width; +- (CGSize)suggestSizeForString:(NSString *)string width:(CGFloat)width; @end diff --git a/WordPress/Classes/UILabel+SuggestSize.m b/WordPress/Classes/UILabel+SuggestSize.m index ef4362be89e9..e59c89ca7bef 100644 --- a/WordPress/Classes/UILabel+SuggestSize.m +++ b/WordPress/Classes/UILabel+SuggestSize.m @@ -11,16 +11,18 @@ @implementation UILabel (SuggestSize) - (CGSize)suggestedSizeForWidth:(CGFloat)width { - - return [self suggestSizeForString:self.text atWidth:width]; - + if (self.attributedText) + return [self suggestSizeForAttributedString:self.attributedText width:width]; + + return [self suggestSizeForString:self.text width:width]; } +- (CGSize)suggestSizeForAttributedString:(NSAttributedString *)string width:(CGFloat)width { + return [string boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size; +} -- (CGSize)suggestSizeForString:(NSString *)string atWidth:(CGFloat)width { - - return [string sizeWithFont:self.font constrainedToSize:CGSizeMake(width, 9999.0f) lineBreakMode:self.lineBreakMode]; - +- (CGSize)suggestSizeForString:(NSString *)string width:(CGFloat)width { + return [string sizeWithFont:self.font constrainedToSize:CGSizeMake(width, CGFLOAT_MAX) lineBreakMode:self.lineBreakMode]; } @end From 09c564ea07254b8158420c09f1924a377f88416d Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 12:28:44 -0800 Subject: [PATCH 25/38] Custom line heights for title and summary --- WordPress/Classes/ReaderPostTableViewCell.m | 45 ++++++++++++++------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 1b70f784e72d..9e3d3d1054c0 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -83,13 +83,14 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { // Title desiredHeight += RPTVCVerticalPadding; - desiredHeight += [post.postTitle sizeWithFont:[self titleFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + NSAttributedString *postTitle = [self titleAttributedStringForPost:post]; + desiredHeight += [postTitle boundingRectWithSize:CGSizeMake(contentWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size.height; desiredHeight += RPTVCVerticalPadding; // Post summary if ([post.summary length] > 0) { - NSString *postSummary = [self prettySummaryForPost:post]; - desiredHeight += [postSummary sizeWithFont:[self summaryFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + NSAttributedString *postSummary = [self summaryAttributedStringForPost:post]; + desiredHeight += [postSummary boundingRectWithSize:CGSizeMake(contentWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size.height; } // Tag @@ -108,14 +109,32 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { return ceil(desiredHeight); } -+ (NSString *)prettySummaryForPost:(ReaderPost *)post { - NSString *prettySummary = [post.summary trim]; ++ (NSAttributedString *)titleAttributedStringForPost:(ReaderPost *)post { + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineHeightMultiple:1.25f]; + NSDictionary *attributes = @{NSParagraphStyleAttributeName : style, + NSFontAttributeName : [self titleFont]}; + NSMutableAttributedString *titleString = [[NSMutableAttributedString alloc] initWithString:[post.postTitle trim] + attributes:attributes]; + + return titleString; +} + ++ (NSAttributedString *)summaryAttributedStringForPost:(ReaderPost *)post { + NSString *summary = [post.summary trim]; NSInteger newline = [post.summary rangeOfString:@"\n"].location; if (newline != NSNotFound) - prettySummary = [post.summary substringToIndex:newline]; - - return prettySummary; + summary = [post.summary substringToIndex:newline]; + + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineHeightMultiple:1.25f]; + NSDictionary *attributes = @{NSParagraphStyleAttributeName : style, + NSFontAttributeName : [self summaryFont]}; + NSMutableAttributedString *attributedSummary = [[NSMutableAttributedString alloc] initWithString:summary + attributes:attributes]; + + return attributedSummary; } + (NSString *)tagNameForPost:(ReaderPost *)post { @@ -239,8 +258,7 @@ - (void)buildPostContent { self.titleLabel = [[UILabel alloc] init]; _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _titleLabel.backgroundColor = [UIColor clearColor]; - _titleLabel.font = [ReaderPostTableViewCell titleFont]; - _titleLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; + _titleLabel.textColor = [UIColor colorWithHexString:@"333"]; _titleLabel.lineBreakMode = NSLineBreakByWordWrapping; _titleLabel.numberOfLines = 0; [_containerView addSubview:_titleLabel]; @@ -252,8 +270,7 @@ - (void)buildPostContent { self.snippetLabel = [[UILabel alloc] init]; _snippetLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth; _snippetLabel.backgroundColor = [UIColor clearColor]; - _snippetLabel.font = [ReaderPostTableViewCell summaryFont]; - _snippetLabel.textColor = [UIColor colorWithRed:64.0f/255.0f green:64.0f/255.0f blue:64.0f/255.0f alpha:1.0]; + _snippetLabel.textColor = [UIColor colorWithHexString:@"333"]; _snippetLabel.lineBreakMode = NSLineBreakByTruncatingTail; _snippetLabel.numberOfLines = 4; [_containerView addSubview:_snippetLabel]; @@ -458,8 +475,8 @@ - (void)configureCell:(ReaderPost *)post { // so avatars show up after a cell is created, and not dequeued. [self setAvatar:nil]; - _titleLabel.text = [post.postTitle trim]; - _snippetLabel.text = [ReaderPostTableViewCell prettySummaryForPost:post]; + _titleLabel.attributedText = [ReaderPostTableViewCell titleAttributedStringForPost:post]; + _snippetLabel.attributedText = [ReaderPostTableViewCell summaryAttributedStringForPost:post]; _bylineLabel.text = post.blogName; [_timeButton setTitle:[post.dateCreated shortString] forState:UIControlStateNormal]; From 9d85d42863e70c6eecf86954af497b5f3f163959 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Sun, 17 Nov 2013 17:57:50 -0800 Subject: [PATCH 26/38] Store primaryTag and tags in ReaderPost objects - Read tag details off the wire, parse, store them - Display primary tag along with each post - Fix various height calculations --- WordPress/Classes/ReaderPost.h | 4 +++ WordPress/Classes/ReaderPost.m | 27 +++++++++++++- WordPress/Classes/ReaderPostTableViewCell.m | 33 ++++++++++-------- .../WordPress.xcdatamodeld/.xccurrentversion | 2 +- .../WordPress 13.xcdatamodel/elements | Bin 0 -> 491199 bytes .../WordPress 13.xcdatamodel/layout | Bin 0 -> 43932 bytes WordPress/WordPress.xcodeproj/project.pbxproj | 4 ++- 7 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 WordPress/Classes/WordPress.xcdatamodeld/WordPress 13.xcdatamodel/elements create mode 100644 WordPress/Classes/WordPress.xcdatamodeld/WordPress 13.xcdatamodel/layout diff --git a/WordPress/Classes/ReaderPost.h b/WordPress/Classes/ReaderPost.h index 16a24b28fd68..0f4e68376a22 100644 --- a/WordPress/Classes/ReaderPost.h +++ b/WordPress/Classes/ReaderPost.h @@ -45,6 +45,10 @@ extern NSString *const ReaderExtrasArrayKey; @property (nonatomic, strong) NSString *summary; @property (nonatomic, strong) NSMutableSet *comments; @property (nonatomic, readonly, strong) NSURL *featuredImageURL; +@property (nonatomic, strong) NSString *primaryTagName; +@property (nonatomic, strong) NSString *primaryTagSlug; +@property (nonatomic, strong) NSString *tags; + /** An array of dictionaries representing available REST API endpoints to retrieve posts for the Reader. diff --git a/WordPress/Classes/ReaderPost.m b/WordPress/Classes/ReaderPost.m index 05490e50343f..1b5bd352b018 100644 --- a/WordPress/Classes/ReaderPost.m +++ b/WordPress/Classes/ReaderPost.m @@ -62,6 +62,9 @@ @implementation ReaderPost @dynamic storedComment; @dynamic summary; @dynamic comments; +@dynamic primaryTagName; +@dynamic primaryTagSlug; +@dynamic tags; + (void)load { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleLogoutNotification:) name:WordPressComApiDidLogoutNotification object:nil]; @@ -282,7 +285,6 @@ - (void)updateFromDictionary:(NSDictionary *)dict { self.dateSynced = [NSDate date]; } - - (void)updateFromRESTDictionary:(NSDictionary *)dict { // REST api. Freshly Pressed, sites/site/posts @@ -351,6 +353,16 @@ - (void)updateFromRESTDictionary:(NSDictionary *)dict { self.blogURL = [NSString stringWithFormat:@"%@://%@/", url.scheme, url.host]; self.summary = [self createSummary:self.content makePlainText:YES]; + + NSDictionary *tagsDict = [dict objectForKey:@"tags"]; + NSArray *tagsList = [NSArray arrayWithArray:[tagsDict allKeys]]; + self.tags = [tagsList componentsJoinedByString:@", "]; + + if ([tagsDict count] > 0) { + NSDictionary *tagDict = [[tagsDict allValues] objectAtIndex:0]; + self.primaryTagSlug = tagDict[@"slug"]; + self.primaryTagName = tagDict[@"name"]; + } } @@ -423,6 +435,19 @@ - (void)updateFromReaderDictionary:(NSDictionary *)dict { img = [img stringByDecodingXMLCharacters]; self.postAvatar = [self parseImageSrcFromHTML:img]; } + + NSDictionary *tagsDict = [dict objectForKey:@"topics"]; + NSArray *tagsList = [NSArray arrayWithArray:[tagsDict allValues]]; + self.tags = [tagsList componentsJoinedByString:@", "]; + + NSDictionary *primaryTagDict = [dict objectForKey:@"primary_tag"]; + if ([primaryTagDict isKindOfClass:[NSDictionary class]]) { + self.primaryTagName = primaryTagDict[@"name"]; + self.primaryTagSlug = primaryTagDict[@"slug"]; + } else if ([tagsDict count] > 0) { + self.primaryTagSlug = [[tagsDict allKeys] objectAtIndex:0]; + self.primaryTagName = [tagsDict objectForKey:self.primaryTagSlug]; + } } diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 9e3d3d1054c0..59d24996568b 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -21,13 +21,14 @@ const CGFloat RPTVCAuthorPadding = 8.0f; const CGFloat RPTVCHorizontalInnerPadding = 12.0f; const CGFloat RPTVCHorizontalOuterPadding = 8.0f; -const CGFloat RPTVCMetaViewHeight = 52.0f; +const CGFloat RPTVCMetaViewHeight = 48.0f; const CGFloat RPTVCAuthorViewHeight = 32.0f; const CGFloat RPTVCVerticalPadding = 18.0f; const CGFloat RPTVCAvatarSize = 32.0f; const CGFloat RPTVCLineHeight = 1.0f; const CGFloat RPTVCSmallButtonLeftPadding = 2; // Follow, tag const CGFloat RPTVCMaxImageHeightPercentage = 0.59f; +const CGFloat RPTVCMaxSummaryHeight = 100.0f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -80,6 +81,9 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { CGFloat height = ceilf((contentWidth * RPTVCMaxImageHeightPercentage)); desiredHeight += height; } + + // Everything but the image has inner padding + contentWidth -= RPTVCHorizontalInnerPadding * 2; // Title desiredHeight += RPTVCVerticalPadding; @@ -91,13 +95,13 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { if ([post.summary length] > 0) { NSAttributedString *postSummary = [self summaryAttributedStringForPost:post]; desiredHeight += [postSummary boundingRectWithSize:CGSizeMake(contentWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size.height; + desiredHeight += RPTVCVerticalPadding; } // Tag - NSString *tagName = [self tagNameForPost:post]; + NSString *tagName = post.primaryTagName; if ([tagName length] > 0) { - desiredHeight += RPTVCVerticalPadding; - desiredHeight += [tagName sizeWithFont:[self summaryFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height; + desiredHeight += [tagName sizeWithFont:[self summaryFont] constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByClipping].height; } // Padding above and below the line @@ -137,11 +141,6 @@ + (NSAttributedString *)summaryAttributedStringForPost:(ReaderPost *)post { return attributedSummary; } -+ (NSString *)tagNameForPost:(ReaderPost *)post { - // TODO: Get first tag from the post (not currently being stored) - return @"Sample Tag"; -} - + (UIFont *)titleFont { return [UIFont fontWithName:@"Merriweather-Bold" size:21.0f]; } @@ -313,8 +312,6 @@ - (void)buildPostContent { _tagButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; _tagButton.backgroundColor = [UIColor clearColor]; _tagButton.titleLabel.font = [UIFont fontWithName:@"OpenSans" size:12.0f]; - NSString *tagName = [ReaderPostTableViewCell tagNameForPost:self.post]; - [_tagButton setTitle:tagName forState:UIControlStateNormal]; [_tagButton setTitleEdgeInsets: UIEdgeInsetsMake(0, RPTVCSmallButtonLeftPadding, 0, 0)]; [_tagButton setImage:[UIImage imageNamed:@"reader-postaction-tag"] forState:UIControlStateNormal]; [_tagButton setTitleColor:[UIColor colorWithHexString:@"aaa"] forState:UIControlStateNormal]; @@ -398,19 +395,19 @@ - (void)layoutSubviews { // Position the title nextY += RPTVCVerticalPadding; - height = ceil([_titleLabel suggestedSizeForWidth:contentWidth].height); + height = ceil([_titleLabel suggestedSizeForWidth:innerContentWidth].height); _titleLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); nextY += height + RPTVCVerticalPadding; // Position the snippet if ([self.post.summary length] > 0) { - height = ceil([_snippetLabel suggestedSizeForWidth:contentWidth].height); + height = ceil([_snippetLabel suggestedSizeForWidth:innerContentWidth].height); _snippetLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); nextY += ceilf(height + RPTVCVerticalPadding); } // Tag - if ([_tagButton.titleLabel.text length] > 0) { + if ([self.post.primaryTagName length] > 0) { height = ceil([_tagButton.titleLabel suggestedSizeForWidth:innerContentWidth].height); _tagButton.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); nextY += height + RPTVCVerticalPadding; @@ -457,6 +454,7 @@ - (void)prepareForReuse { _bylineLabel.text = nil; _titleLabel.text = nil; _snippetLabel.text = nil; + [_tagButton setTitle:nil forState:UIControlStateNormal]; [self setHighlightedEffect:NO animated:NO]; } @@ -489,6 +487,13 @@ - (void)configureCell:(ReaderPost *)post { self.showImage = YES; self.cellImageView.hidden = NO; } + + if ([self.post.primaryTagName length] > 0) { + _tagButton.hidden = NO; + [_tagButton setTitle:self.post.primaryTagName forState:UIControlStateNormal]; + } else { + _tagButton.hidden = YES; + } if ([self.post isWPCom]) { _likeButton.hidden = NO; diff --git a/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion b/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion index c3e07b633d3c..3a9336008fb5 100644 --- a/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion +++ b/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ _XCCurrentVersionName - WordPress 12.xcdatamodel + WordPress 13.xcdatamodel diff --git a/WordPress/Classes/WordPress.xcdatamodeld/WordPress 13.xcdatamodel/elements b/WordPress/Classes/WordPress.xcdatamodeld/WordPress 13.xcdatamodel/elements new file mode 100644 index 0000000000000000000000000000000000000000..ef09848e36b00f6b98d3b74f0d43275c50ce06ba GIT binary patch literal 491199 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 G=>G#=SGwZ> literal 0 HcmV?d00001 diff --git a/WordPress/Classes/WordPress.xcdatamodeld/WordPress 13.xcdatamodel/layout b/WordPress/Classes/WordPress.xcdatamodeld/WordPress 13.xcdatamodel/layout new file mode 100644 index 0000000000000000000000000000000000000000..e2ac3a0bbdeb3a2c67bb2a0ab6b0f470851a48c8 GIT binary patch literal 43932 zcmcd!2Ygh;^MB>;-g{S*OYgnslIw-kt4Rpyq|gZvAQBP?p(DO0Ac&v{id~T+BGMF5 zL_|>$#NI$fDT;!iND&n&|Jiq`Bo{#a{o}_=?nw4#cE0nS+1c5>5fd8fC$*^6pJO;i zU?e8MgqTQ?tFYF@PN{32RNvHC6WcW6wz`omlLo}rHjf-z4=?wRZE2dI#PGXTZ1N`O zViZPWewaTNfCXaFSTRd<;Goug7o0$Kj3mbbJOr6Q70Ojk3>_rf2AXNBj4=YHS+aa0pEiJD5ypl+uY zPHa3CF*bL8cos^Ev993ARR;p)8TXyolK|D>9meE(RSKF=hOY@Qo4e!qHF09^hkOP z-AqrSTj*)@ESjY``Yw72y_|l8ewN0DX!+PhX(_U@!(} z2!>*$jEwPO0+O;y7`dI9+TOTf}|D+2TBLzPPWrP+Tgm5)Tj$ z7T1bLiN}a<6HgFN7tavS7S9(i5Z^CeDqb#LA%0r?oOr$XdGTiPtKuEvo#NNUZ;AJb z-xq%*{#<-O{I&R7@%Q4>;$OsP#h1i?O9T?3gpnvEK9W#Lm?T^hElHKABOQuNfkg$@wC5t7?B@am+kvuASO0q`stYp1pv*bm| zHpzC$F3DcWKFJ4?FC_;gM0QzV(z~ViN*|CuBz;u+ zlys$Zjr3XRM(NAaSER2=_ekHBek}b&`i1nc^oaDN^k?ZQ=^5!?(o53I(kn7TM$05J zFPV?bUlt^bkR{4eWk#7vmMe3}ie)9T8rfjkXxSK9z3etwlWekVn(THNE1M&`OSVY% zpzIOZD%on;2H6(b4%ut6cVzoypUFO#eJML2J0v?MJ1+ZK_KWN{*?HMtazZYWd&#}! z!SZlP%I}dck}r`z zDt}DATE0g9jQlzIR{2Zvm*qPY-U_9{N8zjRQ}`up}#3g?YmhA6Cec z99hGWbE+q`G&R?bsT<}MIJS0@y=nZ2`o_9Z<#i3UEfA3>jjf+Bsb+lbgbDSHVIKReXtBH6U)M~u^cQHvtl;PjyW(V=ECx@e5?TLixp!1 zSc*+x&1^AS%T8kFvdh`E>~?lPdx$;F{>9-GhX-^`<1JCS{Wjpm5xLs$t`ij`sISOwM} ztAt6a!m44iYGBR>VuP^3*brP8Lo@@k*0iZ(OAOZ{u>8({VtAr(Sd zQH{gaG`VpUn!C!z`iYb43LHaf9Qk#%qxylZoQ>*pod zFfYx_nOc)2HBzgyq^T`hz0PPc=}l&f<@VIbnee(M&8#tKv_`c-t=FnGmfLT4TX+ms z|1>t16|?fsVRpu04cK_B5o-dIPXsM1#@3E%nmV9eoMB$dwikIl+~Ubt2}^llpTPi= zuoi4GHU*mszgb-2{&QQys;;?(mB!>of(q~z^F}299TLIm*bHnY zHfx~UQ5tK<*VVXxteaHR_SY-1+p*d0&)|m=K1X%`F`ySF-~GEGfzMi-n`@`9#O7hMKgAY+N_S%mtH8{a1rFAWRelPuEW#FJ_YMHBp48F| z7G=GMdBy6TMvYacv8yyTn^UFNn;j~vT5VKmj2eqx>u~99Hm&>=Eoy5a}`OaqJ1~N$e>w z;0o+%Y$CQ2TZOI0)?m+IYq4j+oX>$0#W0;S?O;NirnbIkCI1ANZKl?2?g_2cGgX?@NHw5yGpMx%djZ(9qHfH1kZe+k zSF9T*@Q9c*!EVN`$c|cct6&w(=2L}!KhPf4O)#_b9>dyP7|{qd!fWDzg_!YW&f$ z_!;Z+ihIUB!#;%RZov9sA7imRUG=YR9#hxS8YI|gHio6X0T-`f{qI{@7I6>#b|*dgp&o=Fc6^9rbO*df@|PMA~&G&g=iZF386Mu0@;r^CF0y1dZ( zmOMH+vWlm=`InXe)p0}|E96KgM`m$kCJIw_w*`-4#{iKXRJs!T9xUDYl{WpXNI!@g zy=Zf?U7KI9U$Ha1HfK2^x9$CjbdE^ihwg zT6OC!Ed7OD!v4lCV^^@N*l-+khb4#rCN_~xWz$$Kn*a!BokM3fxIB3k@D?6`cnc54L-0^M42#1ffL_vhdQo3bFA1#XW|;(!K@M}1^x;W7 zaC$reIX#|?r{Jl$3dBnXr`PdLufN{u6IjDdx-+i(AG&iK@4R4Bw}&GSh~qsVp%)n9 zIe0E^#cjA9cK{4s2!?n*z_5t5uvu&l>ty=?3=1Lu!1(;b7xE9S9vI!AMHz=0akx9h zzzY%F`mq^Z;Z_P6C4yTfYwmzsf4tH&+^PX?*&T2j#KXK%!V(?&3dbbFgb{pR8}Z_I;|uY7c*rg0NJSg*k_1Qm%@LOn@k1nX!@1MA zy}|hb{6Ty<{t*5!{s_SNF@EeP0M5hN61IY^WCyUN0Ow%<=iD2?c?E*=(`;E+IIn@_ z5rT6$TigNXb@+3h;ru+nxqkJCZ#7$07K;X++Vm!a-LBU= z%%0d2M`nMKH~TjHW&9OaJTbuqP1i25H^`Y2Ly2 z;P2vl@qHl8es&N$7^E4<4(TKfN>5-ZICPkoH>8~{&9(Jo#TEFJBivAjGrJ` zmF^S=9{Eg&A2FyiL=t%DfoVEW)A~|xsQDKE4nK?^!H?p{05w0flVCGDf*s9{WgFO$ zfSL&?76-KQpH9=pe`al(p^XAhAk3U(M|H)_FR-9Sn5koHJ1}z=Kj#@U7XUM3IxzDm zj~ScOuGQ!)CY4R?1k9MNE|pcIx2kknr%h+mtIcMc!;_T|X8z_ea}~cvU<8gO5+q=z zp2y5>ovidGvQjNOZm^r&bQV3RSA~dP<4)EI>OVjYP%~mLP2;D-XM<;Q1WIW-W01P z@o)hfxmgV%Gl@s$q}~wJLQE#65L1b1#B@N=OoSjlwR@1A$KK7}!`{c<1qfP(Sj}@* zN8Evs!?N?cB4;kt2N7}>uyZ?*vw*nUGji?$PJ_zo z(7{h?y~|;B=p81z-IE!B(uk#q(ufC%<-|k8!&ox$C{WrWp3)X~G6PR(bJ=@4#g@)t zka+SxAT%Tmlwv@dHN-Q-TH;xd<~fjN2`|n4-KAODNt!N^j@Wn$;g-mR5yEJ1P&>vO_c-w*@e^?ZOCf#+<37n7 z_o?fRyPRFo$+%sh_UkR!){``df6npz^E+{o_=ETpq`3tAvy$hZRh^{a`DZ!1x|1|r zp?39#^n-wv!UGFt-%UTAUg`xCq?nYDQc_0BNd-2X^hTH<(eB49?6d6i>_+wlb{$}1 z8w4;lAHWPVXKHjNSXpXxX&NYPn=}TkPGd5g`9w>rg9JpKrZsEy2BXEGGwQVvT3Yii z(jSmR2C&a{K@J%L8yE;V>)EyK$RQ)hNRP-NqX9V^+K~gkfJ(kbr^W2D+s!JcMi12F z(3?~M7bB$ZdYjc|)T*^=ohMsCcq5a*R>R3uQbneb=~ybMf$+8oY?aGyzCOIIWw$_? z%;P+CF&=3^#`_NwpWbw^@H%9YS!6bu13FkihZlJrwszOyC0++3Bxzc$E=>pJO|4mP zGMcp-jk!yClXU*aDzrf~7f_oD+eR_$S`Tzc_G_a}y?-Jq|YJ5VCi&+dGimL{9LG>}Ejrt`1~R;gN07XpAPc z-T})_t3{=E+3YHd8MZZ?PN&VPu~iGr^P*;1mbCNJNs@Y zTI{^QAs@UUE9L_ZRImdX!*2J4ugBZ*wSs(_T*>2WHAno_j;|9OafBldqvt=i;TGXb z#p7#xZ}?hIK2L5SHp$EyBwt40 zdxib5EBIc6Jz)gCkJ$Yk;Cq97(=+(q0`Ps(0ls&6@Im!htG2ixAlpn@03W1%R;}5h za$1ZQheKm?SWL#=!1o>xz7NO`$&bj7u{82i0N-ak_&)DsYaV?2*)MLgLQ8)6A0QEt z{?|NVeoKBw9wv`~bjN@&5AcL}@Or}B&wh2Y7cZ1G(cu(bgIl&ol9kN8qE%?POnz$ zOdfzJP+$`UUf3#uQs5)-75EAKv2;Nodz}3dO#K7>S3<h=K)K90+xPde*r9=9p+^OEE&{kdf0<98e1O?sgbQ! zIlVE>XtC&EU%vH`Pach}XcFWAngqG*nXYJZK${Cf({JqQ4m9Np3Ou8!5YTk415G9F zmxXG?Qn>1!R9 zp2u6-VKF5PV!^$bMzDlE z&fz#RHHQ<|+Zx)XNMulhuIITJ<`wLo3{?-a;kNbz|Hj%*@L&xzUx5q%<%t>|Yo~^% z1S2x8{cj?(7QBS8v5mvKwnPbDg-$mB2Zu|bL9GKGuM2j0 zhR2)OLJpU8;Nu-09~!$wW3w8pDjQ!GH5zOxi{9jf4RgIot#R1wW{1{8TtRz0g1sog z5$qSdFZe+4A*L04%;s^p0`TGDaIa4IKq(I2Oy}((p%r|NEdTE|#ZjSFa1bRmf^P(e z1m6n21Bs5XRu1<8iE=sI_qw!(m&ng^&M)`@3H2W?U)unMa%e3gA>Mv&VnX@47Uk>k zT5l-(O>kClPH<=Ene<745a(EDjhjDlWhr=Mj2xSS7Uk~T=Ybaf~oAR_~ z2s}E-Vsxm2q1TyOyYkeK@aXhsZWx9_lVm## zg+igoBMgN!f?;?&424o2hI*^s;nYBjni&Lx^u}&gnavutN@LYJtQNh&40ViNU?@}| z7z&j_AEB?%57P+)5DX*TFpTO3LulxX=7SR7+ywJsRvS%Pt7ly<9QMJ&b00(>r!PArXU%6-FHN} zvkv9Xyrnt-r*i`?&_gH`8U?orO(+x!Ett13Lzsz$39~s|&*5qWF9X6|3Wp~HUE*n- z1EDcZtudHQy0*vmKxj0kLCon0lBTweNud=`CbV&QYFCuGprw~5I~DZdcA%`Uu+THg ziV(`uJ5W}}qfDn&yR2rDM&-0Q0A*@u&9LcoCY2NFK4z=M=+f)e9#DpYp|C#+hQexL zjc|Z)Af^`%W{-2Y22A(^hiki;5PF7nouXm43F(N2JxmE74TZyzUH@sGjG`gf38EoC zZyh$*yKSD-3&{u@gyV&c!Y1JaA+r4>L^9YYWb6VCH*t6dhi7rPox{xt1$iix0lyd^ z$+MW$1}KN>3|fm`13fr;9bYlhXw%I6OB$0AB8yQC8G^B`@mDw%S$-OaTe@0)7PNBn zmhS`Y*BzDzF+5v-4zhe^hvnzeN)s&5uPjJ+UyRQTAS;tJG{z_-G(LH}WNipfRP1799ofS-sb`H6U1xKg-E zxEdzn8Ga%htrOwwX(C*_6Z8NL=>BfowC~Vxz3}<}jaF@;*A8xBfIfZX7ErtCv5Qpr zLR*$7+$MZk_zHr*@KuhOg0e!?_es=o#1M`cjGm8d8`VZTk+*QfI*xc2J>TSsmER-J3HS4?`~k4?N5YRmyiYm2io?s1KUO10E#jch4OqE! zm{)(ksF7we7%WCuiRz6S2>!4TRYQBeTBp;&mbe)rtlG?zv`&|%1tNsk4UoudwfuGm zwCo$<6}8r4GOJ;n*33Zo1@hc4IlQ>5=Y9=GFnG@`fm0J5p8K8fuxHObiafWh!*h@G zp6hVgZ3deaHtIEYsK9BQdX?3v*22D+!|t%CH7;ng^8i?$vrq7xeM)#*_>1sY%qaW~ zadw59v-@}BY&hXjIm{~&l{Ri>x`ufrL#3mK2~)u~!u2!ert}N{hSE{mXmqEIFsp7x zN2mk3;ZaxE3#E%N5iTM`q(~qVV#7sL2c?hY@Bth?gu{n%_(%>Ph#)kkmD2xd$|#Zm zFhsE88Po+BA}jY7hC|VRFip5N#c(hI!4#0qQLTxu5gL6M4 zZaNJ07ok@Q5s5pMH-P-q!Z~u4L zD`|;J5jM*>yrC;LE8)x-kInIL$g2aJ14IKoV{W_?hr6+9bZG558(>p!0c_f! z$Y$1=)halXV=!o}CcR5*@nBO#TB4DNv_zvtV?<*`^_W>S4w2SGH)%C@vMGwz{DCw$ z!v*zNwKlCoWzZjLuxLV1qS@1osL+(~tR!msx2$A#vl2|3+vE-~xfzbap;%b&AqpUvTSa`|rXC@pF?10ZBqDMW$ z=Wzs|+dJU1f`^YyZ*^L<7Ol#thJ~=+VTWSB+6djZdaDbX*5DkD!4rH?2}HDtr?zKA zYemnB)?pUWdPHrg^9!gATEE!N$AS36j2wcG<|a17MVtPgm%~8RF%~VM;i3dEUB_VK}Myu>8y}`Sv4-B)dQW0PJkg#Vyi@_M5jf+h<+8F z!TN~KayYopQnYAT!r{xhA#wqSKX9|Fr$BcjO80qdvp3S5Up$Ha6#ezTSz36~{cq6y zGU$F)bdAC&oFcG3lz_t@;_!!&?#ns+kxnpn2WZg!(H>7gbZic5Olgp>w|`mM>Q(KU zQW8pvG`*?N-M;MW4Dvp1kOOQwB6uHn1Ygh#@TmYQkP4!LsSqj@8%~9H5b-7sf0Dyj za`glS2R^0c zfp68DG+KvE4f_?)g$Jbq1C%A9a~LI>Xk!J=M0)DS6M^w512R5krYuw+Dg(=)pk@Nb zU(;&*XSx~x2@YR-D|WU~_FK2J2eeX75ZHySqVlN%sxMVY^#g&6Is7>eUylS{$KlU+ z64;%3fWRAiJt~2;;REeWI4D&~RUvhHpyh5LMJZ*58<1e)4tCCP1NVvEKw3+Uphi-o zs5)vifOISZsemt_@8<9=9R3oAzs%t~IQ#_!(l=W{`cG?HR09GjWRx#<1?faA(+$$C zaEm|(NGDTMJcD!^0_nC6kj~;k>M*PIPLtNEa#}60nQMRti_K_PsU0qxPVX|AjaE-v ze5j;D-GNFv)Sc8EYA!Vo%cLM@g4)(A$mUSn+TM+w;m(6sQK0QZO=|F67D z-3MAN0VFS_mQfE-4^qoPtA{y!Cx^d|w0e!hcXdNDX!XVokbDb;I_fEE#mzz)E#Na- z7w~`tHA+C)K{6~(t%p*B7a|BS=m=J357{vL;a$l>oG zFn@}`{0|$gsBH+y;2C?m0(l3POwiR7S1SY|vRvu*mCeMNjQRX)pCY^#S!E^%0gueS*^7{qD5){cbRR zi^D&-*_I~ii~qm0m--5&z0@JskNy1a_YWNY1&4pd;oorh zVGjQiA@O^JL}-xFt5JE;s7W(v)p}UGLPXUXEqvPqToIBQX@ZVZg9V)^gQY$cF5BBC zD6}U@UE%NpUEoOLaM=r=^&W(KS=!-93u(`Lk~F_3`E@%SY4@HauqT{lb3(J94H~WV zPQ4nst#s&84ZGS1xP-jdQ_B^~dTH2`6rG}#v=8k|`(fF10H5_9LJS01@3-9m`8kJw z$MY&*$k1z`(aZvEKM|>lcBq%>9mSYLu&oA8Aj;Xfe+Ux1zU3H;9bzkxCB1Q^pU4nNTq#(l9I zH;hlh-9jBOE~ZO7vMODMSoKr~j4OFoH5s)wy~E&CK@}ZNWWvrIEZ&?>mD*}^YOQ8C z8sPF&K<5o!!y9}MJ(wOs55;om;k?0rX*Kw--3)%5!_VBB!RzSJw{GxWvRJwvWwCSv zJ)Ul)n?U4=d=`5ai40lnxlSUxvse)M{4IIj6ng5-Mt78`=D4v3cI*i5kYe#5Jq`=q zndnj^E#HTs(ehQywmotBPON?rSGNh z!$!bWJg)i%xEHFSshPhs1+MoPRS!4SbbrO#IHm!v;)0u`&|h@ioy6hLz;&605dU|y zeLjYLM&C~_#U%7H`T_dE%HoRhJR96t!;e=np>||liC3sP&18vGrx~G@1X^J==tq;q zVpc;j7W2Y6{1SgB3H=cLFkEKD|K&>hA#8Tr$d96tOS}@`dKoPoEr-n}tscgJI)_?o zf~u|#J%L^ojTXkVK&i8JyeH@HDhFh^rS`Bnhpb3DE9B5q7>ddB&3D`t$Zhvq0#ZvSZ`UUsJ zQXK+Zrw)IG6ulK#g1|di;uW4Hj1H$utAlMeiy9qmgaQ<_ylV_9gA303!yzW8!C~ev z>7rl7idNA(=-23-96@q~A4i08MD$nm8-SEI>D}~O*kknD^gHw(`dxZ25a@gG|NB@j zJbuLA*wyK}9sXJ!xYns(?TEStNMgDew4kMKd{KR4Mg5FAnDT;=O^pTP`HSd$yZl<~ zEjE1WZmS(RZcH<}46W53aE8Cr+o2JaxiI@2;fqSjKIlOJ3r6@R9Oji?<0vid^y{r7 zqkF14z1ndv6|ge>Dg7D!In2hFV2w_{gs!oJOYiJ;4GkQjf9{xJADy;+XeRmuB3m*W`6;L{z)&T|DrF^57L+E zEA&@atc_rRBsfCqCE^GPN64xwrcZ)dfQI%KQ1CjnKVwKl zaEyQv(htJlSC6f4sk3P?FA@gn^7aga-kyPWOBh_i5A8JojmQhrHjW&PV^g=gDdWv3 z`8sANXtdd64dcW3GJcFdVko$ctA}6VZ)QVwan;u~j6#M4C|LPR|IibdEA)+@J0_3` z;$7gnVOBE1X#DPez_*rY46ywJm)tR7On6rSuVf;4GU+s&2M=eWnHVgLi9;UFB!Xvg zL;y#GAaMA*T`LfJgL-x?YYW^jH)3*29lBVu?Mki=2OHS&@9n+@Z;}Qsg@zA01YUHI zJ_KI1hfxDqkZ&CZzd8aQbQGJ&XqiMt&wJGm^a=VWEDWx1gL}DJ(DiLB=1s#GfgBOs z3Tc409DvPYrEPQLN#h&_>1yLOcJdmBb3_ypDa@^L#4s;&&l-2RII~BkhjjUs&UzQN z>K%Dwy`5e4MxsUZplO?;ZV=Qk1BSNW1PJFoYNxMaYWS-MnL*$rgP9=!zw+9~F+hit z8(X|!&{+3h4r7J`#@he306cnHMP17(rj{AO!>`*vfhF30%RR&>1~QT!nSB*Ani+#e z>G5AX?lE&;dxEyL;aCCMG(njZ1k%=B66Q9@q?mCG5Hg@N<+@CYX@X43$}}_3>BbRB zC=H6^h~&;`5Hr~wt9#9PfFD{zJ2S04wBKxQ(<$9xW0cPLyfxFd{iS@iH8{0_Ef`&4>bus-@l56*HnAI0~jbK*I9yMaL z*Cz`MY@>A7$aEu(-eBGYjo#ul+QVy<$q|sNas(=?!?&#ep2V0%%=^5GfST-EQE^XC zDrU8*_-PwI0U@DMSnI*GPBZ|mpKUbo4WfZV%(on2=LpyJG;joHz{Y&f!1YQT;XpL- zGe;1L{;PrXZ!LHohMEcjORZ)o6ev6M#?h*9hjQQb3aG1U{IirNt6kp{%UphPII z3ItSluG1e4Rp!>E{NK~SWpOO85zK0ZM~%AEfH7bF;%8mUbu`I$)oMCj#*}AOdlNc)YlgBSv$?IF6XmD-lcrtWC!3@Ca>PJQ1LN zK4J{2g~9i+|AGlXjN5rofgJT7LDd5jOzR0$W7|OGnF;OzEf({-ENNqcCNxw-t1__W z{AbIa_KX1D;6YFc4cd6aoL{`8d(J<;mz>{&V&YZe)$qR0@QOhnI#66QM@&XCKoym@ z67(AW_p2N6rdCZ`Zmj9L?wU^OMboal;17FFaJ<3*8A013!Pu4@h<71YctiXqM@;94 zS=Y0|+rSDA@w?)^h!tk=tT2TmW_DqP_il|9K4^E`f5HkM11mVhpLJ#h5a{+cR`{ZQ z@LOYrgNPOG=wO9IJS#Y$<;CXEz%BAtC)`b?hclyAofG=|d2!K0*IpFbBD=W-Hc!Pe;Dd_v0f5Qrg#lP{a0CLQ|6;?Qf z-ue1v!kink!c{Cxf+1ZbP#bmU2Mf_q&{V-Iv*2H|g7}C8>Ss_?gn7N&qe|Tq1PR%b zN(*kFlEhEq56T4cDuwVWE#`?}mIJ3F*!U_udL0@W<8p z`#t!YLC0c2q5(dTXeBz1cz`38_rwQIiAB< zt!@*oYutoowLuH_SfCECw!o<|v_($IW5`n;mps7{&vC?t>pVrW0wSkNvP!ZVdCGb| za`xqj=eu~yGj1^7WO+@pt{waT#Ic?S$8t$Fb#^QeXk(jWZD}9;)*Or9Tie{>Snj?VWCVTX&6^{^ceU8Gix%I1PI?oOjtXS2BTX$jg}lkAYZCfUgmFL1=m9PwJO zj#_gO!^|~CWG%=|3%~kG2FEpkmDtfpz6UD-|Y!hTiZb8A?*ZL z{2H`4#Ordn%@uc`p{4`hlAM*C1C=iD zD*eH$^g2gCJ1Iv%BO-5~UH^ULl8h{N0&+=L?}q0_u6DhZ6ExW2t}HXBK7<2gd)}Pk=o_b!TQB+hf956$6oJ* zpDcElMddPSEe^FBD)?F*AE~7VAQY)lYLc2c;zN%3j3W;AMkvxOEKHgMAC49#wY3ro zw2X4ZN9eQ6;QPn_f>2=0JU}KI=93%bbo4Q)t$R-QaW6TYM_Q3q!TZ+m8Vzcrl>{nRk1H`pctc-4(hJh7q_mMv{BjwicRDdYvC39nj_#2JC69ORk3gW zdvbwyoYAW3p&M)3(p}SUdeO8q#qfK1-Poc1rV!~uL=N{zA?tx9<`37C!+k&w`O>A* zWr!S(0XeYyIO6**-0huj@1P(2;-HCr^hrxYp|FGVk`WZ^_eT zzToL(N5`HlkoR<(-eq^fz3{MC4+VO?3qID&=7h_U?M8Inw@wQe)*5(Emj#2T%R*$K zvM`Q>k9DOuQqr5J%c6NtFTlcN32sj(MQ%?=_lb~#_H`%xLWWh@&9ZX;`ujps-uNBZ{U zHhpE2WG(G(Gm#^Gy131hc4+?-x0w!Z(^odDliR=>__evs?Dny5&22d3HUaGcQZ|ow z8(3mk3|jbDBArVQpV6j=eJ%K?R2zIapjxf9!ohl*(Ot%t%|~vtKz6qbh6&2@1lzVOcSZElq>;s)}8+dSW0KIn$KRr#dHWV?8`LGr!b<~FfNz6&fbUvy{r z_O{9wb7T45?k-<+FY?{kZ91Zj>>zTRuVi0yWFkkxCs=lA&X=Mzv`}_LcC_7X9^lBN zE^hOEJGB3a+x!S_Qz$#x$!*{bQrg_+RQuSs<~F|~x9RvKP1!l#ZOq^_aB-VKWwMzd zuXMQ_?vFM!z-5tk_%J1_+M;(yn+wQoewSU8{lSsx9I4|-Q?G7wnRgqw?nREbx{cQD zHV+`TQFk)C9BSV@TWW4#cKVnc?{0Q=FJ|``ZREbZ+aU3R+T6zIb{k$keP{W?TIDm` zKt4t*59%(T{?_G_9+Ri?ZiD30w7E?mx7+aYnLEp8XqC@$WBD}Q<%1G}N4LHew~@n< zr z9eEXaSwH!JPF@D`*jl|zKB#@{TkHf_TVHR!F!p@4wvr2jqWNNe5Q;Fwqan8 z)nbN=HXQJg-Ue8_8J+InBp(G{Ca;r^mXF~`7e^LyWNB|+CWnmj9??bz@+?$= zB=gv4^ez8it={CY>CF3O!3}T)emSu_uJU`qm1n=42dd2H6@q23JDj1WGP0jrBWNo7 z*JT~~eXV*G-#{<$=Y`$%D!O&Oq89$x^uQw-XW|4KKuke<&`~(4lxrC!$r67VcT#|1PhAqhg%xi*Etdv8u@U)37ZO^ zOU7UDGYig(vLD0si|pO#x>V91uCQVs0}bRq$xp~n%72!hlAo6UBL7u>M*f@pto)q( zy!?Xvclky6AM!utf5|V&|CV2tUy)yxUsGTTTtO&Eg+L)xh!m89Rxk>&LZXl=WD2=L z!I1+vav(f`qIfNsJa^x_M9L|xo90?>kk|RfPWF1G2=18E6u^d^?k+*T=IF4-K zNJ#n{IkJf(CvYUB-OU_1i6dJ$axzCw;mD~RIgKNybL0$;oXL^1IP!LmoXwGUa3sr- z97o=%ycAn<*azzFxIYonSE-y))2tj@k(sSbx$^4~{&k^t$Z_SC6Gzu5S08^aQ>lFa zeTlNq(Wui(<=zpD()&<;j8ggL;!Da`@7@xroF(6VQMp?A?HT2-l20ChUm5whQu$W% z6{YiquS`m%0FP5DciR({#pArZlx4fW^-(JK?c2@2kN2P#bChczAL6A{`pkF>{aOV7 zIx`d7qBPfSejU9O3=g)eXxuf*v*q86MSng=c_>P;2mREb+?X}yWh7#$^2%4zWjtgR z8H!9eK-7MS!BNkj!KrPYz6$;+3qIYwxT51V_n%}ba#o^$;?M9D)=jS)Wo;fgwth-o z^Ct?M!rs5Rsi}p<;Z#)+77d>rXMnq!a^TLDGHNI_nwm&Wqwb(MxRGNXT%K_+wFK_5 zSWZ1jZKrlq2dE#YOK_as3r?2%(*ATH9Rg>ur_(d(+vz)K4$g|sqvyln(0k~`^nGxE za~YhSdYFEUev*EgUQMs1pQAU>o9P$nZS;0H!?z2L?7ant_4d;H=@02o;4IshaHQsI zI8^f;eUwo$ag3R8X#J7v@5HAqlFMd?KM!Zq{viLReJK_(;2gJw4 zr^S~fj6^93mPAMrCFv54L?_9VxFq?KCdo9(LdpG-M`7!DlVq#p4aqN(3sO=ll?F+p zq)F0rsYU9N=1coZ`$>zXrP502Kma$2E``D7R8H-mlQ86wkvihb}G&)E-9`ku6f~JN-tk8 zf3HBVIIjdRwU@=q=H>8md6jsTc}??Lj(h#; z?dKif?eKPa=X>|{?&n?XUEy8hJ;ZyMcdhpXL!ybpMP<^7}g3Gbi1PkaC6{kQiO z?`ul6QmfP}jY_k!k1|u4t;|*0ln!Nqa=5Zy*`RDxPEc~nIm&s;`N{{B%aupRkSf^V~Li|-WQRld*oKI^;QcZ2U{ z-xqzi`M%=2!*{Rmd%o}ce&~D65BDSegnpDC<0tWx`6>Lo{e1ia{nGu+ei?pQemQ=n ze&v4s{i^&%`qlY0`c3s?{qFRe>$lkNKEG{#-}@c+`^oR5-zmRe{LcCP;dj~Zsz2s0 z@mKnX_}ly){uBKt`A_zr>Ob9ora$XH&wru+BL92+SNgB_-{$|i|GWN&{J--*<^PNS z8UM5XR|BvBB0vye2rva$0x|-!0&)VZ0rmiAKwdyWz{r4xfTnkPo2IdEr1x^c` z5x6#RUEun_4S|~iw*+nr+!6Rj;O@Y;13wBp5O^dgB}f(2Cnz&0J1943e9(lT=Ag+z zQ-fv%-5$gS-5E45Xlc*`LCb?44%!#AKj?#?kAgl4`Yh;+paVf)1$`6rZP2lx%fZ56 zI#?Vm4Gs&A2#yMl304PdgEN91!9~F(!DYb%g9iuC3Emw1Lh#n$ZNaYuzZ$$N`0e0* z!TW~J>x&hWY6cZDwqUl{&$_;cYK z!Z(F)3Ev(5cKDv~z2RSk9|%7Zelq-A_=WI`;nyPYh{TA>i0X&|5rZOzL=1}<6;U72 z7%?HDIpX$+xe<#awnl7=_&(xz#7_|?BThy95^*l#kBG|=S0k}VNu*C?Xrv}m7nvJr zi*!V~A}b;*Bda3^L@tb66nSstlE|fz4@54Hd^qya$j2j}j9eA@P2>-eKSiF5JQaC4 z@@fcOaoq8^EQGHO-Svr*4QJs-6< z>f@-dqGO}uqbs5-qpPC_L=TD{5 zig`We&6u}h-ii4#=3va%F^6JK#+-_|5OXC~6idg7V|`-%Vl!jwW5>mgk8O&b7&|F; zTI}tycgD_*y(@NE>|?R3WB12?5PK>1a_rSOERKj1#4&O5IG;GbxPZ9mxTH93TwYv3 zTvc36+`zcOad*cpin}-N{==ibm6XR#Z&xxNGKRpaYiG30?6SEU@6UQeuCAK6^Nt~8ABXL&Z>_j&4 z&cwNiI}+bcd^d4l;{L=#iQgq2Nj#Q#Ch=_Ir6e**nj}y1N(xE}NwOt1B~474lr%YM zYSQ$i*-3Mf79=f9T9mXhX=BoRNk1l?NsdU4N={2wCu@`S$+gL&l1C@kCyz^ROrDtB zk~}4Odh%V#3z8QmFG}8?yd(LI715*a43{4r6QlGLUWoOE+ls8k}N_i*c-IVuJK1um9IQ>IRe`EtRe~x>rB!9994eP8Usa~6P|Z-SRjpG!uiB{Eta?%PifX57x9V-x zyQ=Tgurwykl9rK{pH`Swlva{9EA5UnE^ThwU1@ixElRsD?f$d}(wG|np=>yY8rjJe^ zn?5mpQu?Fm@22lde?R@h^pDd&OFx+YZThkFx3s(OHWkb02_L zzouFXcT=SG>rDlz0t>zWYtD2pfH#8q;KGGc29M$}+`9*U^^QY#LHcDHpE!9?N zE49_yf!bl(QQCTKgSJU~k9Mi{G3{>c+uF0*^V*BrKed;%S9FAq(n)m+of1CE)TqnR z_19JDM(XNxV|2Iars}5aX6k0^*6TLvw&-5eZPUG?+o5}1_lE8*-DSN{PwORmnLb<} zsgKde>vejAK3kusFV$D*EA>P5!}as^TlL%Y+x0v2JN0kq-_gIP|49F-{tNwCgWM2c z$TJiestf}RgA79r;|${sO@?N}D#IGXvxfDCjfO3Tt%jEk+YPT7UN>AcTr(0zp^-8M z8iS2t#z^>d+H@n_PG{_EEHaiDYm5VpoN=RZi*c)Qn{m7GHRGGcJ;wdU4~?G~Pa6L) z`ItgXi6;1rRugAhXnNW7s%fWbmua`@9n*WJk4&GN4w$|+T{K-Wi_KDVwRyOCym^AT z**w|2(!9pJ*8H6LdGjXo3+9*1FPmRAziWQa{J!}k^JVij3vLluL>9&(wJ0p!7GI0i z;;`gd3M~CB#g;Nle@m5RfMv5~yX7^@F3X#iPc5HY4p_dn{A4+4IcNF1kDw3Lhv}p2 zu%sn5hdEq$iltlP5g%37SYJZopxuB`X7KFs$9vQS;w+|$oeVUH#;CZ zI6E{uB0DNOHaj6ZDLXa0F1s;%Vs=aRl?gC=W^c~kp8Z<(>)G#S z@5}xzCoCr-CpsrKCq5@BCoM;pW6sIQ$<7&=Gc||J*_`u2&aRv{bKc6?lk-{5mpKP> zzR9I?CAqR(uUuuWUv6M-NN!keWNuk*MQ&B@fZV~k!*WOD*5!`Ly)CyPcXjTD+|9W! z=Dw7>CwFh|{@f39zsdbJ_s85bxqs&VoqNS9veMRc>tO3pYpr#pwaz-$I^NoBoobz7 zz1{kVb%k}E^@8=HEyfmSOSC21Qf=urz0G3Fh7Uw`*oNE2+9ulWvMsPZXnV-^i0yIP zI@@~N2HR%aQQP;nA8jXXr)_6!=WM^*{;*xLUAF7(S@vAJ-R`tk*=y{B>_hG2?BnfI z?047~*zd6~wlB9oY~N)+Z9ii_XTM*X!&`CQb&R}PxGs9_fmN?6t)0~|1Ugr|$Qs;xtmCn`9XPoPt zUpo&u4?B-Jk2_B|PdR^e{^mUI{N1H;8C@1vrYqZ3;wp3XcU8MaxkkI1T+>{fYp&}q z*L|-0U9Y%~yH2=Hxqfl|<~r~C({&|}$P?z#c`ybtoe%sZR+SH38p&JW9v&)4M}@=f`D^7HZw@(c5e^Y6&#^5^Ey z&tI6oIDbk0vit}0AI^U?|I_?$^1sVJn*V+Nh5U>8f8}2;U4c(CB%f+q@A7OX9Ju3$sKzJiYnzAZT1H@UB_@9@4O`;P8Aw(q#U zjeRHeo!0mEzHHw)eIM$(qVH>c-|qWK-_QD<=zF&B)k3_GEEE;`6#5qi7KRk|D=aQ7 zE9_rbT{y6CNa66p5ruVyV+tQDTwS=f@VUb03wIXoD%@T8PT{A8pBH{x_+#Oj!gGZe z3a=Di>lfdzqF-gdntlWO4emFr->81|{TlmC?AOxozJ3q&ThZ@Szh8=ii$aScilT~Q zisFk>iqu7hB6CqjQB~29qR~Y&i*7GkShT3<-lF@9o-A5Xw6bVT(U(OBi@quPuIOmd z4@Ex}{akdq=uFYs;^bmov9Z`voKf7bxVX5ixPNhN@yOza;>pFci@D-C#fysXEq8jFaO4pS> zU%Ih$OX-WHuaurGy;ORo3@anbe9HXF0?R_m63ddybY+=k&a(WnzGW3MSMk0MPbE| zil&M?E9O-!s90FBxMFF=Qx$6}Ua0t_;;?e_H>! z{g?HBw*S`tyZayLf2jZA{zv=&(EpeImnvf`6Drk}*_F=9ipmj{<0=~~Csa?>-ctQy z^|tDFt3RwhQ2kx?Pt_-@PgkF*zFZ@$k=A(E#MfwRa%=Ky3TujMN^2@=s%nPROsZjP z7S!BRv$$qS&6=8LYu49ntl3htqh@c-{+bVK4%D2fximmIAa;OefO&v*K;?je0~!ZR z8F0sd#RHZOSTW$80ec7RAMoLTkN>ZxGk5G| zaZTH_Y15`@jwWf79!c7yN!uI_#wmk=+=5&p6J#(PA~>1&ats9IkQ-qLa*7Hs&+|U- z_lNK2kN7^%_fvedxUTp_@hMAdOOBu51#R?04Q=ghuiCoUUbp4i2G{_b-R8BSHp~{XakizlwYE*RFKydw+ig2-=WG{j zmuy#U*KId#w`{j=pJM z_MP@!_C5B8;Pc=M;EP}ja2PlO91V^I^TF}pL~t@#1kMC`Fb>L~3Z_9FG{F+E6s!eL zfmgxb!FuqvBgfIj(bdt-(ZkWp(bv)6G0-v0G0suoa5_*2>7X4U2j`gWnCn>J_|&o3 z@tI?zqt@}W<5y=BXESGK=Nr!M&YsTR&LK|72|EcVl9L_tA_gCYPxbj@%Tm`N|*Cf~bu4%3hT_3sZuB0pF(p;vi#8v8=>zeQS z)OFPLo9mYAj_aQ5p*z>z-TkJ!kGr3HfP0X8uzRRG&ppvS#f`WrH|vhLdAI0Z=q_`Y zyFYWUbbs!ya36D@a9@J6;B2@%+#Bu(4}b^3d9WWQU=EJLJgmZLcoV!Gu7a!KeeePJ zNB9r;Pxv1E5dI7P2Y%{l;CbFN*fY*k;3@P>_C!1}kLZy+Nl(h7c??g9XMv~EQ{}1l z?DOpR)Ocz=hdhV9&AjcruXsCoJ9~?~)4bEYGrbnC)eCwdFYNVtN$))GLT{P3+`G)X z!n@kL*1O(&*?Sjx4rzomMw%i+k>SWFBoE0)3Xno%GE#(0Ly8dyfe{f&BPKEnnS;zj zHX>V)uaK{iZ;&eFAo4p>k39C}`g-_A`0{-DzVW_^zL`GBr}#ec&GyalE%ufB_W6GD z9rK;=o${UWokts^P0<(87HCVfHQE+!k9I^Sqs6Ed1yKl{g_ff8(1qwCbP2i)U5>6o zH=u{nW9SL=6#6TA4!wY0La+L}`1|<#`v>~p@k4&M-|I*Hn4k31{-B@p$Nj7PYyIo} z8~vO8Tm2RO?f#wq`&c8a74|aL7VCf&Vw14?5ogvtl6T#C#Zyg|HHAA+`it zhONL>VY{(!vG1_`SPgavJB>HSo8mcmSG*hE6Yq@=!66*R37o~ z06B`xBlF4eWRPUZ2+5NoDUk}9A~mvkDM2t1))pt7iJstwhi>PU^I#!~sz zc&d<^OchbnsOeOSnoBL97Ew#68tNc*h&oIirH)f4sngV1>I&VQ&Z4vFHgr4s75Y`W zGyOVUOnYb_jnO2%gkDN7r&rNy=ymi4dK3L6{SAGV{*AswU!||pH|am%xq>3GoLAE)-dasuiuuE`AaCmT3FfW)NEDU}W3`Lr@3~At8Tgc4%&Be(2LsS*SepS!hLQb?8LsQs`>vdgvyb!**f2vfbF8 zY%jJi`xg5)`wlyjg;HZ2Xmmt$baZSqKRP}-F*+q$6rCC6qw%O5Rio*s9yOyS(b8y5^mz1S^mO!WtYs`a z)+W|I)-m>KtV^tGtXr%{tbc5JY-Y?7v&Fy|6m!QsF<)#|Y-?;!Y;SB|>_F^M>~ZX0 z{yDx8-W#OvY%@h|aj@kzXYd_a6q{N4Dl_=x!E z_}KV+@$vDZ_{VV|&c@?$C7zD!aWlR;{(1b1_{R8_ctw0~{AT=*#Pf+}iI);tiR?t@ z#Dv78#Pr0>L~#O2xD&>+-|5APrHSQwQ^Utj6x1X8J z?@QgKo>FhApEN*vTN*44l}1RTqyot=5fUW@C02?^F-edT(kIevX^u2s+AsYe9h449 zhoz&^ap|P=t8`YnA~%<_C*`D( zEJ@BzE=n#=?oA#{9!b_Ee@UKBo>dwtO_ZiebESpSN@=aMQQ9lHN)P2trH^7$Km}4@ z1yN81R{{#7gcLzpp{!OuSH4g-DqEDT$~I-YvQIgn)F`#ezsgg!q1sq&s=lbUP+O@l zt8LXBb*%cHIzgSJPEn_-AE?vSnW|g$sy-D{%hhG-3U#&mxw>B6sBTfeQY+Nm>VCCG zy`!#Vr>>>$ zr0%62q@Jc5qh!+!{q)21 zCC*$!px$~lFUz;pEE}? zb(vo>r!r?U=Q9^GmoxQRYpt!;LF=UDXs>BqwOp--25A9J&=Q)gsoK}t4y{tF(yF!Z zwEbF*R;wM-j%(+%3)&6siQY(Wr@x_x^{6iB30>9|J*8)KLod;1>vQ!5`XYU?zEoeX zuhiG*>+}u!W__!^P2aBX)OYE7^u7A``T_k%{U`lD`cb`3|3yEgpV80j7xl}=Fk_@K z#u#T57=^}UqsaKcm|=Wu0EXRg8g9dDpayOP48~xMh`}3iLpD?+V;Dw>QEJRH78+$n zx$&8?(pY1xGd38Tjjcw7vBTJH>^BY?|1s)}v&Kc^no)23X*@LkF&mgo%;sh*v#r_D z>|*AcZ<_tgx6L8uNVCA4WKK0_n0C`;A|`IqCTH@dWTs5RoNdlGmzvwmO7jQvuzB3P ZX4ad3K3ngfrD4PWv1R`M`2RNV{TE^{Iy3+P literal 0 HcmV?d00001 diff --git a/WordPress/WordPress.xcodeproj/project.pbxproj b/WordPress/WordPress.xcodeproj/project.pbxproj index 23c499910b5b..d08afa97f777 100644 --- a/WordPress/WordPress.xcodeproj/project.pbxproj +++ b/WordPress/WordPress.xcodeproj/project.pbxproj @@ -1321,6 +1321,7 @@ 46F8714E1838C41600BC149B /* NSDate+StringFormatting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+StringFormatting.m"; sourceTree = ""; }; 46F871501839528C00BC149B /* reader-postaction-time.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-time.png"; path = "Resources/Images/reader-postaction-time.png"; sourceTree = ""; }; 46F871511839528C00BC149B /* reader-postaction-time@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "reader-postaction-time@2x.png"; path = "Resources/Images/reader-postaction-time@2x.png"; sourceTree = ""; }; + 46F871551839802100BC149B /* WordPress 13.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = file; path = "WordPress 13.xcdatamodel"; sourceTree = ""; }; 5D0077A5182AE9DF00F865DB /* ReaderMediaQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReaderMediaQueue.h; sourceTree = ""; }; 5D0077A6182AE9DF00F865DB /* ReaderMediaQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReaderMediaQueue.m; sourceTree = ""; }; 5D119DA1176FBE040073D83A /* UIImageView+AFNetworkingExtra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworkingExtra.h"; sourceTree = ""; }; @@ -5728,6 +5729,7 @@ E125443B12BF5A7200D87A0A /* WordPress.xcdatamodeld */ = { isa = XCVersionGroup; children = ( + 46F871551839802100BC149B /* WordPress 13.xcdatamodel */, 5D42A3BB175E686F005CFF05 /* WordPress 12.xcdatamodel */, E17B98E7171FFB450073E30D /* WordPress 11.xcdatamodel */, FDFB011916B1EA1C00F589A8 /* WordPress 10.xcdatamodel */, @@ -5741,7 +5743,7 @@ 8350E15911D28B4A00A7B073 /* WordPress.xcdatamodel */, E125443D12BF5A7200D87A0A /* WordPress 2.xcdatamodel */, ); - currentVersion = 5D42A3BB175E686F005CFF05 /* WordPress 12.xcdatamodel */; + currentVersion = 46F871551839802100BC149B /* WordPress 13.xcdatamodel */; name = WordPress.xcdatamodeld; path = Classes/WordPress.xcdatamodeld; sourceTree = ""; From fbbd143ffaaa561e885e45cbb1113f9b45cc0934 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 09:54:50 -0800 Subject: [PATCH 27/38] Tapping a tag lets you browse that tag's posts --- WordPress/Classes/ReaderPostsViewController.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index c0c9c765aaa6..3a8dbe5284f0 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -459,7 +459,16 @@ - (void)commentAction:(id)sender { } - (void)tagAction:(id)sender { - // TODO: allow browsing directly to a tag + ReaderPostTableViewCell *cell = [ReaderPostTableViewCell cellForSubview:sender]; + ReaderPost *post = cell.post; + + NSString *endpoint = [NSString stringWithFormat:@"read/tags/%@/posts", post.primaryTagSlug]; + NSDictionary *dict = @{@"endpoint" : endpoint, + @"title" : post.primaryTagName}; + + [[NSUserDefaults standardUserDefaults] setObject:dict forKey:ReaderCurrentTopicKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + [self readerTopicChanged]; } #pragma mark - ReaderTextForm Delegate Methods From 07d119dba89642c831b2e33bb3bd580f417da9a1 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 10:21:20 -0800 Subject: [PATCH 28/38] Fallback logic for displaying blog/display/author name --- WordPress/Classes/ReaderPost.h | 1 + WordPress/Classes/ReaderPost.m | 9 +++++++++ WordPress/Classes/ReaderPostTableViewCell.m | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ReaderPost.h b/WordPress/Classes/ReaderPost.h index 0f4e68376a22..810686a9c75a 100644 --- a/WordPress/Classes/ReaderPost.h +++ b/WordPress/Classes/ReaderPost.h @@ -133,6 +133,7 @@ extern NSString *const ReaderExtrasArrayKey; - (NSDictionary *)getStoredComment; +- (NSString *)authorString; - (NSString *)avatar; diff --git a/WordPress/Classes/ReaderPost.m b/WordPress/Classes/ReaderPost.m index 1b5bd352b018..cfac9b19b9b5 100644 --- a/WordPress/Classes/ReaderPost.m +++ b/WordPress/Classes/ReaderPost.m @@ -668,6 +668,15 @@ - (NSDictionary *)getStoredComment { return @{@"commentID":commentID, @"comment":commentText}; } +- (NSString *)authorString { + if ([self.blogName length] > 0) { + return self.blogName; + } else if ([self.authorDisplayName length] > 0) { + return self.authorDisplayName; + } else { + return self.author; + } +} - (NSString *)avatar { return (self.postAvatar == nil) ? self.authorAvatarURL : self.postAvatar; diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 59d24996568b..560d982a353b 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -476,7 +476,8 @@ - (void)configureCell:(ReaderPost *)post { _titleLabel.attributedText = [ReaderPostTableViewCell titleAttributedStringForPost:post]; _snippetLabel.attributedText = [ReaderPostTableViewCell summaryAttributedStringForPost:post]; - _bylineLabel.text = post.blogName; + _bylineLabel.text = [post authorString]; + [_timeButton setTitle:[post.dateCreated shortString] forState:UIControlStateNormal]; self.showImage = NO; From 74fcabacd2138c0a718df6db1800ab59a565577f Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 11:10:03 -0800 Subject: [PATCH 29/38] Made site/blog ID handling more robust to handle tag endpoint - Also handle sites that can't be followed --- WordPress/Classes/ReaderPost.h | 1 + WordPress/Classes/ReaderPost.m | 9 +++++++++ WordPress/Classes/ReaderPostTableViewCell.m | 15 ++++++++++----- WordPress/Classes/ReaderPostsViewController.m | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ReaderPost.h b/WordPress/Classes/ReaderPost.h index 810686a9c75a..9153c9c23880 100644 --- a/WordPress/Classes/ReaderPost.h +++ b/WordPress/Classes/ReaderPost.h @@ -115,6 +115,7 @@ extern NSString *const ReaderExtrasArrayKey; - (NSString *)prettyDateString; +- (BOOL)isFollowable; - (BOOL)isFreshlyPressed; diff --git a/WordPress/Classes/ReaderPost.m b/WordPress/Classes/ReaderPost.m index cfac9b19b9b5..4e4e120328b9 100644 --- a/WordPress/Classes/ReaderPost.m +++ b/WordPress/Classes/ReaderPost.m @@ -212,6 +212,12 @@ + (void)createOrUpdateWithDictionary:(NSDictionary *)dict forEndpoint:(NSString NSNumber *blogSiteID = [dict numberForKey:@"site_id"]; NSNumber *siteID = [dict numberForKey:@"blog_id"]; NSNumber *postID = [dict numberForKey:@"ID"]; + + // Some endpoints (e.g. tags) use different case + if (siteID == nil) { + siteID = [dict numberForKey:@"site_ID"]; + blogSiteID = [dict numberForKey:@"site_ID"]; + } // following, likes and topics endpoints if ([dict valueForKey:@"blog_site_id"] != nil) { @@ -631,6 +637,9 @@ - (NSString *)prettyDateString { return [formatter stringFromDate:date]; } +- (BOOL)isFollowable { + return self.siteID != nil; +} - (BOOL)isFreshlyPressed { return ([self.endpoint rangeOfString:@"freshly-pressed"].location != NSNotFound)? YES : NO; diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 560d982a353b..0c3bccd5c932 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -120,7 +120,7 @@ + (NSAttributedString *)titleAttributedStringForPost:(ReaderPost *)post { NSFontAttributeName : [self titleFont]}; NSMutableAttributedString *titleString = [[NSMutableAttributedString alloc] initWithString:[post.postTitle trim] attributes:attributes]; - + return titleString; } @@ -375,10 +375,15 @@ - (void)layoutSubviews { CGFloat bylineX = RPTVCAvatarSize + RPTVCAuthorPadding + RPTVCHorizontalInnerPadding; _bylineLabel.frame = CGRectMake(bylineX, RPTVCAuthorPadding - 2, contentWidth - bylineX, 18); - CGFloat followX = bylineX - 4; // Fudge factor for image alignment - CGFloat followY = RPTVCAuthorPadding + _bylineLabel.frame.size.height - 2; - height = ceil([_followButton.titleLabel suggestedSizeForWidth:innerContentWidth].height); - _followButton.frame = CGRectMake(followX, followY, contentWidth - bylineX, height); + if ([self.post isFollowable]) { + _followButton.hidden = NO; + CGFloat followX = bylineX - 4; // Fudge factor for image alignment + CGFloat followY = RPTVCAuthorPadding + _bylineLabel.frame.size.height - 2; + height = ceil([_followButton.titleLabel suggestedSizeForWidth:innerContentWidth].height); + _followButton.frame = CGRectMake(followX, followY, contentWidth - bylineX, height); + } else { + _followButton.hidden = YES; + } nextY += RPTVCAuthorViewHeight + RPTVCAuthorPadding; diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 3a8dbe5284f0..f5c2b9fa3367 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -443,6 +443,9 @@ - (void)followAction:(id)sender { UIButton *followButton = (UIButton *)sender; ReaderPostTableViewCell *cell = [ReaderPostTableViewCell cellForSubview:sender]; ReaderPost *post = cell.post; + + if (![post isFollowable]) + return; followButton.selected = ![post.isFollowing boolValue]; // Set it optimistically [cell setNeedsLayout]; From 3b5d039d692314d6c5fc24172573e9fd0323c71d Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 11:30:30 -0800 Subject: [PATCH 30/38] Aesthetic tweaks: line heights, padding --- WordPress/Classes/ReaderPostTableViewCell.m | 26 ++++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 0c3bccd5c932..88a171a4a657 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -23,12 +23,13 @@ const CGFloat RPTVCHorizontalOuterPadding = 8.0f; const CGFloat RPTVCMetaViewHeight = 48.0f; const CGFloat RPTVCAuthorViewHeight = 32.0f; -const CGFloat RPTVCVerticalPadding = 18.0f; +const CGFloat RPTVCVerticalPadding = 16.0f; const CGFloat RPTVCAvatarSize = 32.0f; -const CGFloat RPTVCLineHeight = 1.0f; +const CGFloat RPTVCBorderHeight = 1.0f; const CGFloat RPTVCSmallButtonLeftPadding = 2; // Follow, tag const CGFloat RPTVCMaxImageHeightPercentage = 0.59f; -const CGFloat RPTVCMaxSummaryHeight = 100.0f; +const CGFloat RPTVCSummaryPaddingOffset = 12.0f; // Summary bounds are calculated to be quite tall; offset them +const CGFloat RPTVCLineHeightMultiple = 1.15f; // Control buttons (Like, Reblog, ...) const CGFloat RPTVCControlButtonHeight = 48.0f; @@ -93,6 +94,7 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { // Post summary if ([post.summary length] > 0) { + desiredHeight -= RPTVCSummaryPaddingOffset * 2; NSAttributedString *postSummary = [self summaryAttributedStringForPost:post]; desiredHeight += [postSummary boundingRectWithSize:CGSizeMake(contentWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size.height; desiredHeight += RPTVCVerticalPadding; @@ -115,7 +117,7 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { + (NSAttributedString *)titleAttributedStringForPost:(ReaderPost *)post { NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; - [style setLineHeightMultiple:1.25f]; + [style setLineHeightMultiple:RPTVCLineHeightMultiple]; NSDictionary *attributes = @{NSParagraphStyleAttributeName : style, NSFontAttributeName : [self titleFont]}; NSMutableAttributedString *titleString = [[NSMutableAttributedString alloc] initWithString:[post.postTitle trim] @@ -132,7 +134,7 @@ + (NSAttributedString *)summaryAttributedStringForPost:(ReaderPost *)post { summary = [post.summary substringToIndex:newline]; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; - [style setLineHeightMultiple:1.25f]; + [style setLineHeightMultiple:RPTVCLineHeightMultiple]; NSDictionary *attributes = @{NSParagraphStyleAttributeName : style, NSFontAttributeName : [self summaryFont]}; NSMutableAttributedString *attributedSummary = [[NSMutableAttributedString alloc] initWithString:summary @@ -395,7 +397,7 @@ - (void)layoutSubviews { nextY += height; } else { _titleBorder.hidden = NO; - _titleBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCLineHeight); + _titleBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCBorderHeight); } // Position the title @@ -406,9 +408,15 @@ - (void)layoutSubviews { // Position the snippet if ([self.post.summary length] > 0) { + // Remove some padding on top + nextY -= RPTVCSummaryPaddingOffset; + height = ceil([_snippetLabel suggestedSizeForWidth:innerContentWidth].height); _snippetLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); nextY += ceilf(height + RPTVCVerticalPadding); + + // Remove some padding below + nextY -= RPTVCSummaryPaddingOffset; } // Tag @@ -423,12 +431,12 @@ - (void)layoutSubviews { // Position the meta view and its subviews _metaView.frame = CGRectMake(0, nextY, contentWidth, RPTVCMetaViewHeight); - _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCLineHeight); + _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCBorderHeight); BOOL commentsOpen = [[self.post commentsOpen] boolValue]; CGFloat buttonWidth = RPTVCControlButtonWidth; CGFloat buttonX = _metaView.frame.size.width - RPTVCControlButtonWidth; - CGFloat buttonY = RPTVCLineHeight; // Just below the line + CGFloat buttonY = RPTVCBorderHeight; // Just below the line // Button order from right-to-left: Like, [Comment], Reblog, _likeButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, RPTVCControlButtonHeight); @@ -444,7 +452,7 @@ - (void)layoutSubviews { _reblogButton.frame = CGRectMake(buttonX, buttonY, buttonWidth - RPTVCControlButtonBorderSize, RPTVCControlButtonHeight); CGFloat timeWidth = contentWidth - _reblogButton.frame.origin.x; - _timeButton.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCLineHeight, timeWidth, RPTVCControlButtonHeight); + _timeButton.frame = CGRectMake(RPTVCHorizontalInnerPadding, RPTVCBorderHeight, timeWidth, RPTVCControlButtonHeight); CGFloat sideBorderX = RPTVCHorizontalOuterPadding - 1; // Just to the left of the container CGFloat sideBorderHeight = self.frame.size.height - RPTVCVerticalPadding; // Just below it From 282a33f5df099ea67055b8a70d03170de884869b Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 11:50:48 -0800 Subject: [PATCH 31/38] Clamp summary height and remove padding offset --- WordPress/Classes/ReaderPostTableViewCell.m | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index 88a171a4a657..b2c6e26e430b 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -28,7 +28,7 @@ const CGFloat RPTVCBorderHeight = 1.0f; const CGFloat RPTVCSmallButtonLeftPadding = 2; // Follow, tag const CGFloat RPTVCMaxImageHeightPercentage = 0.59f; -const CGFloat RPTVCSummaryPaddingOffset = 12.0f; // Summary bounds are calculated to be quite tall; offset them +const CGFloat RPTVCMaxSummaryHeight = 90.0f; const CGFloat RPTVCLineHeightMultiple = 1.15f; // Control buttons (Like, Reblog, ...) @@ -94,9 +94,8 @@ + (CGFloat)cellHeightForPost:(ReaderPost *)post withWidth:(CGFloat)width { // Post summary if ([post.summary length] > 0) { - desiredHeight -= RPTVCSummaryPaddingOffset * 2; NSAttributedString *postSummary = [self summaryAttributedStringForPost:post]; - desiredHeight += [postSummary boundingRectWithSize:CGSizeMake(contentWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size.height; + desiredHeight += [postSummary boundingRectWithSize:CGSizeMake(contentWidth, RPTVCMaxSummaryHeight) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil].size.height; desiredHeight += RPTVCVerticalPadding; } @@ -408,15 +407,10 @@ - (void)layoutSubviews { // Position the snippet if ([self.post.summary length] > 0) { - // Remove some padding on top - nextY -= RPTVCSummaryPaddingOffset; - height = ceil([_snippetLabel suggestedSizeForWidth:innerContentWidth].height); + height = MIN(height, RPTVCMaxSummaryHeight); _snippetLabel.frame = CGRectMake(RPTVCHorizontalInnerPadding, nextY, innerContentWidth, height); nextY += ceilf(height + RPTVCVerticalPadding); - - // Remove some padding below - nextY -= RPTVCSummaryPaddingOffset; } // Tag From d838f5856bcd9e6fd8f22622fae471cfaa94662d Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 12:20:32 -0800 Subject: [PATCH 32/38] Keep comment button hidden unless wpcom --- WordPress/Classes/ReaderPostTableViewCell.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index b2c6e26e430b..c9a769dfc646 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -427,7 +427,7 @@ - (void)layoutSubviews { _metaView.frame = CGRectMake(0, nextY, contentWidth, RPTVCMetaViewHeight); _metaBorder.frame = CGRectMake(RPTVCHorizontalInnerPadding, 0, contentWidth - RPTVCHorizontalInnerPadding * 2, RPTVCBorderHeight); - BOOL commentsOpen = [[self.post commentsOpen] boolValue]; + BOOL commentsOpen = [[self.post commentsOpen] boolValue] && [self.post isWPCom]; CGFloat buttonWidth = RPTVCControlButtonWidth; CGFloat buttonX = _metaView.frame.size.width - RPTVCControlButtonWidth; CGFloat buttonY = RPTVCBorderHeight; // Just below the line From 8c7e830f09541afd4d0c7e30e3a27681c8a76b57 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Mon, 18 Nov 2013 12:42:11 -0800 Subject: [PATCH 33/38] Fix a small padding problem --- WordPress/Classes/ReaderPostTableViewCell.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/ReaderPostTableViewCell.m b/WordPress/Classes/ReaderPostTableViewCell.m index c9a769dfc646..3502047ab99f 100644 --- a/WordPress/Classes/ReaderPostTableViewCell.m +++ b/WordPress/Classes/ReaderPostTableViewCell.m @@ -28,7 +28,7 @@ const CGFloat RPTVCBorderHeight = 1.0f; const CGFloat RPTVCSmallButtonLeftPadding = 2; // Follow, tag const CGFloat RPTVCMaxImageHeightPercentage = 0.59f; -const CGFloat RPTVCMaxSummaryHeight = 90.0f; +const CGFloat RPTVCMaxSummaryHeight = 88.0f; const CGFloat RPTVCLineHeightMultiple = 1.15f; // Control buttons (Like, Reblog, ...) From 233c6015e1654eb434761b2780331964e02afa78 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Tue, 19 Nov 2013 00:23:20 -0800 Subject: [PATCH 34/38] Handle an empty topics list --- WordPress/Classes/ReaderPost.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ReaderPost.m b/WordPress/Classes/ReaderPost.m index 4e4e120328b9..72f23f5e5e45 100644 --- a/WordPress/Classes/ReaderPost.m +++ b/WordPress/Classes/ReaderPost.m @@ -443,8 +443,11 @@ - (void)updateFromReaderDictionary:(NSDictionary *)dict { } NSDictionary *tagsDict = [dict objectForKey:@"topics"]; - NSArray *tagsList = [NSArray arrayWithArray:[tagsDict allValues]]; - self.tags = [tagsList componentsJoinedByString:@", "]; + + if ([tagsDict count] > 0) { + NSArray *tagsList = [NSArray arrayWithArray:[tagsDict allValues]]; + self.tags = [tagsList componentsJoinedByString:@", "]; + } NSDictionary *primaryTagDict = [dict objectForKey:@"primary_tag"]; if ([primaryTagDict isKindOfClass:[NSDictionary class]]) { From 60ee08019d9bb2ca69fa850952c5ebb220398e6f Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Tue, 19 Nov 2013 00:58:37 -0800 Subject: [PATCH 35/38] Remove unused code --- WordPress/Classes/ReaderPostsViewController.m | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index f5c2b9fa3367..8126c51b1ab1 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -198,23 +198,6 @@ - (void)viewWillDisappear:(BOOL)animated { [[NSNotificationCenter defaultCenter] removeObserver:self]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; -} - -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; - - CGFloat width; - // The new width should be the window - if (IS_IPAD) { - width = IPAD_DETAIL_WIDTH; - } else { - CGRect frame = self.view.window.frame; - width = UIInterfaceOrientationIsLandscape(toInterfaceOrientation) ? frame.size.height : frame.size.width; - } -} - - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; // After rotation, visible images might be scaled up/down From 812b3d321551628f052453ec1444ce5201db36c1 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Tue, 19 Nov 2013 01:02:04 -0800 Subject: [PATCH 36/38] Fix top table margin on first load --- WordPress/Classes/ReaderPostsViewController.m | 34 +++++-------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 8126c51b1ab1..be44df8c6d11 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -32,6 +32,7 @@ #define IPAD_DETAIL_WIDTH 448.0f static CGFloat const ScrollingFastVelocityThreshold = 30.f; +static CGFloat const RPVCHeaderHeightPhone = 10.f; NSString *const WPReaderViewControllerDisplayedNativeFriendFinder = @"DisplayedNativeFriendFinder"; @interface ReaderPostsViewController () { @@ -99,8 +100,6 @@ - (void)viewDidLoad { _featuredImageSource.delegate = self; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - [self configureTableHeader]; - // Topics button UIBarButtonItem *button = nil; if (IS_IOS7) { @@ -217,26 +216,6 @@ - (void)setTitle:(NSString *)title { tabItem.title = NSLocalizedString(@"Reader", @"Description of the Reader tab"); } -- (void)configureTableHeader { - if (IS_IPAD) - return; - - if ([self.resultsController.fetchedObjects count] == 0) { - self.tableView.tableHeaderView = nil; - return; - } - - if (self.tableView.tableHeaderView != nil) { - return; - } - - UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 10.0f)]; - paddingView.autoresizingMask = UIViewAutoresizingFlexibleWidth; - paddingView.backgroundColor = [WPStyleGuide itsEverywhereGrey]; - - self.tableView.tableHeaderView = paddingView; -} - - (void)dismissPopover { if (_popover) { [_popover dismissPopoverAnimated:YES]; @@ -766,8 +745,6 @@ - (void)onSyncSuccess:(AFHTTPRequestOperation *)operation response:(id)responseO if ([postsArr count] < ReaderPostsToSync && wasLoadingMore) { _hasMoreContent = NO; } - - [self configureTableHeader]; } @@ -778,6 +755,13 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPa return [ReaderPostTableViewCell cellHeightForPost:[self.resultsController objectAtIndexPath:indexPath] withWidth:self.tableView.bounds.size.width]; } +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { + if (IS_IPHONE) + return RPVCHeaderHeightPhone; + + return [super tableView:tableView heightForHeaderInSection:section]; +} + - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (_readerReblogFormView.superview != nil) { [self hideReblogForm]; @@ -834,8 +818,6 @@ - (void)readerTopicChanged { [self.tableView reloadData]; [self syncItems]; - [self configureTableHeader]; - self.title = [[ReaderPost currentTopic] stringForKey:@"title"]; if ([WordPressAppDelegate sharedWordPressApplicationDelegate].connectionAvailable == YES && ![self isSyncing] ) { From 96c521f449a89c7b3b620241f85c5531c7b2bcf9 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Tue, 19 Nov 2013 01:03:56 -0800 Subject: [PATCH 37/38] Cleaned up defines and consts --- WordPress/Classes/ReaderPostsViewController.m | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index be44df8c6d11..84e71cf47371 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -29,11 +29,9 @@ #import "WPPopoverBackgroundView.h" #import "IOS7CorrectedTextView.h" -#define IPAD_DETAIL_WIDTH 448.0f - -static CGFloat const ScrollingFastVelocityThreshold = 30.f; +static CGFloat const RPVCScrollingFastVelocityThreshold = 30.f; static CGFloat const RPVCHeaderHeightPhone = 10.f; -NSString *const WPReaderViewControllerDisplayedNativeFriendFinder = @"DisplayedNativeFriendFinder"; +NSString *const RPVCDisplayedNativeFriendFinder = @"DisplayedNativeFriendFinder"; @interface ReaderPostsViewController () { BOOL _hasMoreContent; @@ -454,7 +452,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat offset = self.tableView.contentOffset.y; // We just take a diff from the last known offset, as the approximation is good enough CGFloat velocity = fabsf(offset - _lastOffset); - if (velocity > ScrollingFastVelocityThreshold && self.isScrolling) { + if (velocity > RPVCScrollingFastVelocityThreshold && self.isScrolling) { _isScrollingFast = YES; } else { _isScrollingFast = NO; @@ -937,14 +935,14 @@ - (CGSize)tabBarSize { - (BOOL)shouldDisplayfriendFinderNudgeView { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - return ![userDefaults boolForKey:WPReaderViewControllerDisplayedNativeFriendFinder] && self.friendFinderNudgeView == nil; + return ![userDefaults boolForKey:RPVCDisplayedNativeFriendFinder] && self.friendFinderNudgeView == nil; } - (void)showFriendFinderNudgeView:(id)sender { if ([self shouldDisplayfriendFinderNudgeView]) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; - [userDefaults setBool:YES forKey:WPReaderViewControllerDisplayedNativeFriendFinder]; + [userDefaults setBool:YES forKey:RPVCDisplayedNativeFriendFinder]; [userDefaults synchronize]; CGRect buttonFrame = CGRectMake(0,self.navigationController.view.frame.size.height,self.view.frame.size.width, 0.f); From ab258b76b73aa7ce3d612c568fd24a545cf9ad42 Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Tue, 19 Nov 2013 01:50:40 -0800 Subject: [PATCH 38/38] Fix black bar beneath reblog form --- WordPress/Classes/ReaderPostsViewController.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/ReaderPostsViewController.m b/WordPress/Classes/ReaderPostsViewController.m index 84e71cf47371..a152274401de 100644 --- a/WordPress/Classes/ReaderPostsViewController.m +++ b/WordPress/Classes/ReaderPostsViewController.m @@ -238,7 +238,8 @@ - (void)handleKeyboardDidShow:(NSNotification *)notification { } point = [view.window convertPoint:endFrame.origin toView:view]; - frame.size.height = point.y; + CGSize tabBarSize = [self tabBarSize]; + frame.size.height = point.y + tabBarSize.height; [UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionBeginFromCurrentState animations:^{ view.frame = frame;