2010-07-15 00:44:38 -04:00
|
|
|
//
|
|
|
|
// FeedDetailTableCell.m
|
|
|
|
// NewsBlur
|
|
|
|
//
|
|
|
|
// Created by Samuel Clay on 7/14/10.
|
|
|
|
// Copyright 2010 NewsBlur. All rights reserved.
|
|
|
|
//
|
|
|
|
|
2012-07-22 17:08:29 -07:00
|
|
|
#import "NewsBlurAppDelegate.h"
|
2010-07-15 00:44:38 -04:00
|
|
|
#import "FeedDetailTableCell.h"
|
2012-07-22 17:08:29 -07:00
|
|
|
#import "ABTableViewCell.h"
|
|
|
|
#import "UIView+TKCategory.h"
|
|
|
|
#import "Utilities.h"
|
2010-07-15 00:44:38 -04:00
|
|
|
|
2012-07-22 17:08:29 -07:00
|
|
|
static UIFont *textFont = nil;
|
|
|
|
static UIFont *indicatorFont = nil;
|
2010-07-15 00:44:38 -04:00
|
|
|
|
2012-07-23 10:57:11 -07:00
|
|
|
|
2010-07-15 00:44:38 -04:00
|
|
|
@implementation FeedDetailTableCell
|
|
|
|
|
|
|
|
@synthesize storyTitle;
|
|
|
|
@synthesize storyAuthor;
|
|
|
|
@synthesize storyDate;
|
2012-08-10 18:10:07 -07:00
|
|
|
@synthesize storyScore;
|
2012-07-22 14:23:50 -07:00
|
|
|
@synthesize siteTitle;
|
|
|
|
@synthesize siteFavicon;
|
2012-07-22 17:08:29 -07:00
|
|
|
@synthesize isRead;
|
2013-08-05 18:32:43 -07:00
|
|
|
@synthesize isStarred;
|
|
|
|
@synthesize isShared;
|
2012-08-08 18:23:48 -07:00
|
|
|
@synthesize isShort;
|
2012-07-22 17:08:29 -07:00
|
|
|
@synthesize isRiverOrSocial;
|
|
|
|
@synthesize feedColorBar;
|
|
|
|
@synthesize feedColorBarTopBorder;
|
2012-07-23 10:57:11 -07:00
|
|
|
@synthesize hasAlpha;
|
2010-07-15 00:44:38 -04:00
|
|
|
|
2012-08-09 11:06:38 -07:00
|
|
|
|
2013-02-21 12:19:15 -08:00
|
|
|
#define leftMargin 30
|
2012-07-22 17:08:29 -07:00
|
|
|
#define rightMargin 18
|
|
|
|
|
|
|
|
|
2012-07-22 17:21:32 -07:00
|
|
|
+ (void) initialize {
|
2012-07-22 17:08:29 -07:00
|
|
|
if (self == [FeedDetailTableCell class]) {
|
|
|
|
textFont = [UIFont boldSystemFontOfSize:18];
|
|
|
|
indicatorFont = [UIFont boldSystemFontOfSize:12];
|
2010-07-15 00:44:38 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-08 18:23:48 -07:00
|
|
|
- (void)drawContentView:(CGRect)r highlighted:(BOOL)highlighted {
|
2012-08-10 18:10:07 -07:00
|
|
|
|
|
|
|
|
2012-07-23 10:57:11 -07:00
|
|
|
int adjustForSocial = 3;
|
|
|
|
if (self.isRiverOrSocial) {
|
|
|
|
adjustForSocial = 20;
|
|
|
|
}
|
2012-07-22 17:08:29 -07:00
|
|
|
|
|
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
|
2012-07-23 10:57:11 -07:00
|
|
|
CGRect rect = CGRectInset(r, 12, 12);
|
|
|
|
rect.size.width -= 18; // Scrollbar padding
|
2013-02-14 15:36:21 -08:00
|
|
|
|
2013-09-24 17:18:20 -07:00
|
|
|
UIColor *backgroundColor;
|
|
|
|
backgroundColor = highlighted ? UIColorFromRGB(0xFFFDEF) : UIColorFromRGB(0xf4f4f4);
|
|
|
|
[backgroundColor set];
|
2012-07-22 17:08:29 -07:00
|
|
|
|
|
|
|
CGContextFillRect(context, r);
|
2013-02-14 15:36:21 -08:00
|
|
|
|
|
|
|
if (highlighted) {
|
2013-09-24 17:18:20 -07:00
|
|
|
// [NewsBlurAppDelegate fillGradient:r startColor:UIColorFromRGB(0xFFFDEF) endColor:UIColorFromRGB(0xFFFDDF)];
|
2013-02-14 15:36:21 -08:00
|
|
|
}
|
|
|
|
|
2012-07-22 17:08:29 -07:00
|
|
|
UIColor *textColor;
|
|
|
|
UIFont *font;
|
2012-10-16 17:24:01 -07:00
|
|
|
|
2012-07-22 17:08:29 -07:00
|
|
|
if (self.isRead) {
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica" size:11];
|
|
|
|
textColor = UIColorFromRGB(0x808080);
|
2012-07-22 17:08:29 -07:00
|
|
|
} else {
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica-Bold" size:11];
|
2012-07-22 17:08:29 -07:00
|
|
|
textColor = UIColorFromRGB(0x606060);
|
|
|
|
|
|
|
|
}
|
2012-10-04 15:44:25 -07:00
|
|
|
if (highlighted) {
|
2013-07-22 17:38:38 -07:00
|
|
|
textColor = UIColorFromRGB(0x686868);
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
2013-09-25 17:43:00 -07:00
|
|
|
|
|
|
|
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
|
|
|
|
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
|
|
|
|
paragraphStyle.alignment = NSTextAlignmentLeft;
|
2012-07-22 17:08:29 -07:00
|
|
|
|
2012-07-23 10:57:11 -07:00
|
|
|
if (self.isRiverOrSocial) {
|
2013-09-25 17:43:00 -07:00
|
|
|
[self.siteTitle drawInRect:CGRectMake(leftMargin + 20, 7, rect.size.width - 20, 21)
|
|
|
|
withAttributes:@{NSFontAttributeName: font,
|
|
|
|
NSForegroundColorAttributeName: textColor,
|
|
|
|
NSParagraphStyleAttributeName: paragraphStyle}];
|
2012-07-23 10:57:11 -07:00
|
|
|
|
|
|
|
if (self.isRead) {
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica" size:12];
|
|
|
|
textColor = UIColorFromRGB(0x606060);
|
2012-07-23 10:57:11 -07:00
|
|
|
|
|
|
|
} else {
|
|
|
|
textColor = UIColorFromRGB(0x333333);
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica-Bold" size:12];
|
2012-07-23 10:57:11 -07:00
|
|
|
}
|
2012-10-04 15:44:25 -07:00
|
|
|
if (highlighted) {
|
2012-07-28 23:31:12 -07:00
|
|
|
textColor = UIColorFromRGB(0x686868);
|
2012-07-23 10:57:11 -07:00
|
|
|
}
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
|
|
|
|
2013-09-25 17:43:00 -07:00
|
|
|
// story title
|
|
|
|
CGSize theSize = [self.storyTitle
|
|
|
|
boundingRectWithSize:CGSizeMake(rect.size.width, 30.0)
|
|
|
|
options:nil
|
|
|
|
attributes:@{NSFontAttributeName: font,
|
|
|
|
NSParagraphStyleAttributeName: paragraphStyle}
|
|
|
|
context:nil].size;
|
2012-08-07 09:57:21 -07:00
|
|
|
|
2012-08-10 18:10:07 -07:00
|
|
|
int storyTitleY = 7 + adjustForSocial + ((30 - theSize.height)/2);
|
2013-08-05 17:29:42 -07:00
|
|
|
if (self.isShort) {
|
2012-08-10 18:10:07 -07:00
|
|
|
storyTitleY = 7 + adjustForSocial + 2;
|
2012-08-08 18:23:48 -07:00
|
|
|
}
|
2013-08-05 17:29:42 -07:00
|
|
|
int storyTitleX = leftMargin;
|
|
|
|
if (self.isStarred) {
|
|
|
|
UIImage *savedIcon = [UIImage imageNamed:@"clock"];
|
|
|
|
[savedIcon drawInRect:CGRectMake(storyTitleX, storyTitleY - 1, 16, 16) blendMode:nil alpha:1];
|
|
|
|
storyTitleX += 20;
|
|
|
|
}
|
|
|
|
if (self.isShared) {
|
|
|
|
UIImage *savedIcon = [UIImage imageNamed:@"menu_icn_share"];
|
|
|
|
[savedIcon drawInRect:CGRectMake(storyTitleX, storyTitleY - 1, 16, 16) blendMode:nil alpha:1];
|
|
|
|
storyTitleX += 20;
|
|
|
|
}
|
2013-09-25 17:43:00 -07:00
|
|
|
[self.storyTitle drawInRect:CGRectMake(storyTitleX, storyTitleY, rect.size.width - storyTitleX + leftMargin, theSize.height)
|
|
|
|
withAttributes:@{NSFontAttributeName: font,
|
|
|
|
NSForegroundColorAttributeName: textColor,
|
|
|
|
NSParagraphStyleAttributeName: paragraphStyle}];
|
2012-08-07 09:57:21 -07:00
|
|
|
|
2013-07-02 16:11:14 -07:00
|
|
|
int storyAuthorDateY = 41 + adjustForSocial;
|
2013-08-05 17:29:42 -07:00
|
|
|
if (self.isShort) {
|
2012-08-13 17:35:04 -07:00
|
|
|
storyAuthorDateY -= 13;
|
2012-08-08 18:23:48 -07:00
|
|
|
}
|
2012-08-10 18:10:07 -07:00
|
|
|
|
2012-07-22 17:08:29 -07:00
|
|
|
// story author style
|
|
|
|
if (self.isRead) {
|
2013-09-25 17:43:00 -07:00
|
|
|
textColor = UIColorFromRGB(0x959595);
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica" size:10];
|
2012-07-22 17:08:29 -07:00
|
|
|
} else {
|
2013-09-25 17:43:00 -07:00
|
|
|
textColor = UIColorFromRGB(0xA6A8A2);
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica-Bold" size:10];
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
2012-10-04 15:44:25 -07:00
|
|
|
if (highlighted) {
|
2012-07-28 23:31:12 -07:00
|
|
|
textColor = UIColorFromRGB(0x686868);
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
2013-09-25 17:43:00 -07:00
|
|
|
|
2012-08-08 18:23:48 -07:00
|
|
|
[self.storyAuthor
|
2012-08-10 18:10:07 -07:00
|
|
|
drawInRect:CGRectMake(leftMargin, storyAuthorDateY, (rect.size.width) / 2 - 10, 15.0)
|
2013-09-25 17:43:00 -07:00
|
|
|
withAttributes:@{NSFontAttributeName: font,
|
|
|
|
NSForegroundColorAttributeName: textColor,
|
|
|
|
NSParagraphStyleAttributeName: paragraphStyle}];
|
2012-07-22 17:08:29 -07:00
|
|
|
// story date
|
|
|
|
if (self.isRead) {
|
|
|
|
textColor = UIColorFromRGB(0xbabdd1);
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica" size:10];
|
2012-07-22 17:08:29 -07:00
|
|
|
} else {
|
|
|
|
textColor = UIColorFromRGB(0x262c6c);
|
2013-07-02 16:11:14 -07:00
|
|
|
font = [UIFont fontWithName:@"Helvetica-Bold" size:10];
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
|
|
|
|
2012-10-04 15:44:25 -07:00
|
|
|
if (highlighted) {
|
2012-07-28 23:31:12 -07:00
|
|
|
textColor = UIColorFromRGB(0x686868);
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
|
|
|
|
2013-09-25 17:43:00 -07:00
|
|
|
paragraphStyle.alignment = NSTextAlignmentRight;
|
2012-07-22 17:08:29 -07:00
|
|
|
[self.storyDate
|
2012-08-10 18:10:07 -07:00
|
|
|
drawInRect:CGRectMake(leftMargin + (rect.size.width) / 2 - 10, storyAuthorDateY, (rect.size.width) / 2 + 10, 15.0)
|
2013-09-25 17:43:00 -07:00
|
|
|
withAttributes:@{NSFontAttributeName: font,
|
|
|
|
NSForegroundColorAttributeName: textColor,
|
|
|
|
NSParagraphStyleAttributeName: paragraphStyle}];
|
2012-08-07 09:57:21 -07:00
|
|
|
// feed bar
|
2012-08-10 18:10:07 -07:00
|
|
|
|
2013-02-21 12:19:15 -08:00
|
|
|
CGContextSetStrokeColor(context, CGColorGetComponents([self.feedColorBarTopBorder CGColor]));
|
2012-08-07 09:57:21 -07:00
|
|
|
if (self.isRead) {
|
2013-02-21 12:19:15 -08:00
|
|
|
CGContextSetAlpha(context, 0.15);
|
2012-08-07 09:57:21 -07:00
|
|
|
}
|
2013-02-21 12:19:15 -08:00
|
|
|
CGContextSetLineWidth(context, 4.0f);
|
2012-08-11 18:03:28 -07:00
|
|
|
CGContextBeginPath(context);
|
2013-02-21 14:44:34 -08:00
|
|
|
CGContextMoveToPoint(context, 2.0f, 1.0f);
|
|
|
|
CGContextAddLineToPoint(context, 2.0f, self.frame.size.height - 1);
|
2012-08-11 18:03:28 -07:00
|
|
|
CGContextStrokePath(context);
|
2012-08-10 18:10:07 -07:00
|
|
|
|
2012-08-13 17:35:04 -07:00
|
|
|
CGContextSetStrokeColor(context, CGColorGetComponents([self.feedColorBar CGColor]));
|
|
|
|
CGContextBeginPath(context);
|
2013-02-21 14:44:34 -08:00
|
|
|
CGContextMoveToPoint(context, 6.0f, 1.0f);
|
|
|
|
CGContextAddLineToPoint(context, 6.0, self.frame.size.height - 1);
|
2012-08-13 17:35:04 -07:00
|
|
|
CGContextStrokePath(context);
|
2012-08-07 09:57:21 -07:00
|
|
|
|
2012-08-08 12:02:54 -07:00
|
|
|
// reset for borders
|
2012-08-10 18:10:07 -07:00
|
|
|
|
2012-08-08 12:02:54 -07:00
|
|
|
CGContextSetAlpha(context, 1.0);
|
2012-08-07 09:57:21 -07:00
|
|
|
CGContextSetLineWidth(context, 1.0f);
|
2012-10-04 15:44:25 -07:00
|
|
|
if (highlighted) {
|
2012-07-23 10:57:11 -07:00
|
|
|
// top border
|
2013-03-04 17:15:50 -08:00
|
|
|
UIColor *blue = UIColorFromRGB(0xF9F8F4);
|
2012-07-23 10:57:11 -07:00
|
|
|
|
|
|
|
CGContextSetStrokeColor(context, CGColorGetComponents([blue CGColor]));
|
|
|
|
|
|
|
|
CGContextBeginPath(context);
|
2012-07-28 23:31:12 -07:00
|
|
|
CGContextMoveToPoint(context, 0, 0.5f);
|
2012-07-29 22:44:28 -07:00
|
|
|
CGContextAddLineToPoint(context, self.bounds.size.width, 0.5f);
|
2012-07-23 10:57:11 -07:00
|
|
|
CGContextStrokePath(context);
|
|
|
|
|
|
|
|
// bottom border
|
|
|
|
CGContextBeginPath(context);
|
2012-08-10 18:10:07 -07:00
|
|
|
CGContextMoveToPoint(context, 0, self.bounds.size.height - 1.5f);
|
|
|
|
CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height - 1.5f);
|
2012-07-23 10:57:11 -07:00
|
|
|
CGContextStrokePath(context);
|
|
|
|
} else {
|
|
|
|
// top border
|
2012-08-10 18:10:07 -07:00
|
|
|
UIColor *white = UIColorFromRGB(0xffffff);
|
2012-07-23 10:57:11 -07:00
|
|
|
|
2012-08-10 18:10:07 -07:00
|
|
|
CGContextSetStrokeColor(context, CGColorGetComponents([white CGColor]));
|
2012-07-23 10:57:11 -07:00
|
|
|
|
|
|
|
CGContextBeginPath(context);
|
|
|
|
CGContextMoveToPoint(context, 0.0f, 0.5f);
|
2012-08-10 18:10:07 -07:00
|
|
|
CGContextAddLineToPoint(context, self.bounds.size.width, 0.5f);
|
2012-07-23 10:57:11 -07:00
|
|
|
CGContextStrokePath(context);
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// site favicon
|
2012-07-23 10:57:11 -07:00
|
|
|
if (self.isRead && !self.hasAlpha) {
|
|
|
|
if (self.isRiverOrSocial) {
|
|
|
|
self.siteFavicon = [self imageByApplyingAlpha:self.siteFavicon withAlpha:0.25];
|
|
|
|
}
|
|
|
|
self.hasAlpha = YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (self.isRiverOrSocial) {
|
2012-08-10 18:10:07 -07:00
|
|
|
[self.siteFavicon drawInRect:CGRectMake(leftMargin, 6.0, 16.0, 16.0)];
|
|
|
|
}
|
|
|
|
|
|
|
|
// story indicator
|
|
|
|
int storyIndicatorY = 4 + adjustForSocial;
|
|
|
|
if (self.isShort){
|
|
|
|
storyIndicatorY = 4 + adjustForSocial - 5 ;
|
|
|
|
}
|
|
|
|
|
2013-02-21 12:19:15 -08:00
|
|
|
UIImage *unreadIcon;
|
2012-08-10 18:10:07 -07:00
|
|
|
if (storyScore == -1) {
|
2013-02-21 12:19:15 -08:00
|
|
|
unreadIcon = [UIImage imageNamed:@"g_icn_hidden"];
|
|
|
|
} else if (storyScore == 1) {
|
|
|
|
unreadIcon = [UIImage imageNamed:@"g_icn_focus"];
|
2012-07-23 10:57:11 -07:00
|
|
|
} else {
|
2013-02-21 12:19:15 -08:00
|
|
|
unreadIcon = [UIImage imageNamed:@"g_icn_unread"];
|
2012-08-10 18:10:07 -07:00
|
|
|
}
|
|
|
|
|
2013-02-21 12:19:15 -08:00
|
|
|
[unreadIcon drawInRect:CGRectMake(15, storyIndicatorY + 14, 8, 8) blendMode:nil alpha:(self.isRead ? .15 : 1)];
|
2012-07-23 10:57:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (UIImage *)imageByApplyingAlpha:(UIImage *)image withAlpha:(CGFloat) alpha {
|
|
|
|
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0f);
|
|
|
|
|
|
|
|
CGContextRef ctx = UIGraphicsGetCurrentContext();
|
|
|
|
CGRect area = CGRectMake(0, 0, image.size.width, image.size.height);
|
|
|
|
|
|
|
|
CGContextScaleCTM(ctx, 1, -1);
|
|
|
|
CGContextTranslateCTM(ctx, 0, -area.size.height);
|
|
|
|
|
|
|
|
CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
|
|
|
|
|
|
|
|
CGContextSetAlpha(ctx, alpha);
|
|
|
|
|
|
|
|
CGContextDrawImage(ctx, area, image.CGImage);
|
|
|
|
|
|
|
|
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
|
|
|
|
|
|
UIGraphicsEndImageContext();
|
2012-07-22 17:08:29 -07:00
|
|
|
|
2012-07-23 10:57:11 -07:00
|
|
|
return newImage;
|
2012-07-22 17:08:29 -07:00
|
|
|
}
|
2010-07-15 00:44:38 -04:00
|
|
|
|
|
|
|
|
|
|
|
@end
|