| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993 |
- //
- // WBFeedCell.m
- // YYKitExample
- //
- // Created by ibireme on 15/9/5.
- // Copyright (c) 2015 ibireme. All rights reserved.
- //
- #import "WBStatusCell.h"
- #import "YYControl.h"
- @implementation WBStatusTitleView
- - (instancetype)initWithFrame:(CGRect)frame {
- if (frame.size.width == 0 && frame.size.height == 0) {
- frame.size.width = kScreenWidth;
- frame.size.height = kWBCellTitleHeight;
- }
- self = [super initWithFrame:frame];
- _titleLabel = [YYLabel new];
- _titleLabel.size = CGSizeMake(kScreenWidth - 100, self.height);
- _titleLabel.left = kWBCellPadding;
- _titleLabel.displaysAsynchronously = YES;
- _titleLabel.ignoreCommonProperties = YES;
- _titleLabel.fadeOnHighlight = NO;
- _titleLabel.fadeOnAsynchronouslyDisplay = NO;
- [self addSubview:_titleLabel];
-
- CALayer *line = [CALayer layer];
- line.size = CGSizeMake(self.width, CGFloatFromPixel(1));
- line.bottom = self.height;
- line.backgroundColor = kWBCellLineColor.CGColor;
- [self.layer addSublayer:line];
- self.exclusiveTouch = YES;
- return self;
- }
- @end
- @implementation WBStatusProfileView {
- BOOL _trackingTouch;
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- if (frame.size.width == 0 && frame.size.height == 0) {
- frame.size.width = kScreenWidth;
- frame.size.height = kWBCellProfileHeight;
- }
- self = [super initWithFrame:frame];
- self.exclusiveTouch = YES;
- @weakify(self);
-
- _avatarView = [UIImageView new];
- _avatarView.size = CGSizeMake(40, 40);
- _avatarView.origin = CGPointMake(kWBCellPadding, kWBCellPadding + 3);
- _avatarView.contentMode = UIViewContentModeScaleAspectFill;
- [self addSubview:_avatarView];
-
- CALayer *avatarBorder = [CALayer layer];
- avatarBorder.frame = _avatarView.bounds;
- avatarBorder.borderWidth = CGFloatFromPixel(1);
- avatarBorder.borderColor = [UIColor colorWithWhite:0.000 alpha:0.090].CGColor;
- avatarBorder.cornerRadius = _avatarView.height / 2;
- avatarBorder.shouldRasterize = YES;
- avatarBorder.rasterizationScale = kScreenScale;
- [_avatarView.layer addSublayer:avatarBorder];
-
- _avatarBadgeView = [UIImageView new];
- _avatarBadgeView.size = CGSizeMake(14, 14);
- _avatarBadgeView.center = CGPointMake(_avatarView.right - 6, _avatarView.bottom - 6);
- _avatarBadgeView.contentMode = UIViewContentModeScaleAspectFit;
- [self addSubview:_avatarBadgeView];
-
- _nameLabel = [YYLabel new];
- _nameLabel.size = CGSizeMake(kWBCellNameWidth, 24);
- _nameLabel.left = _avatarView.right + kWBCellNamePaddingLeft;
- _nameLabel.centerY = 27;
- _nameLabel.displaysAsynchronously = YES;
- _nameLabel.ignoreCommonProperties = YES;
- _nameLabel.fadeOnAsynchronouslyDisplay = NO;
- _nameLabel.fadeOnHighlight = NO;
- _nameLabel.lineBreakMode = NSLineBreakByClipping;
- _nameLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
- [self addSubview:_nameLabel];
-
- _sourceLabel = [YYLabel new];
- _sourceLabel.frame = _nameLabel.frame;
- _sourceLabel.centerY = 47;
- _sourceLabel.displaysAsynchronously = YES;
- _sourceLabel.ignoreCommonProperties = YES;
- _sourceLabel.fadeOnAsynchronouslyDisplay = NO;
- _sourceLabel.fadeOnHighlight = NO;
- _sourceLabel.highlightTapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
- if ([weak_self.cell.delegate respondsToSelector:@selector(cell:didClickInLabel:textRange:)]) {
- [weak_self.cell.delegate cell:weak_self.cell didClickInLabel:(YYLabel *)containerView textRange:range];
- }
- };
- [self addSubview:_sourceLabel];
-
- return self;
- }
- - (void)setVerifyType:(WBUserVerifyType)verifyType {
- _verifyType = verifyType;
- switch (verifyType) {
- case WBUserVerifyTypeStandard: {
- _avatarBadgeView.hidden = NO;
- _avatarBadgeView.image = [WBStatusHelper imageNamed:@"avatar_vip"];
- } break;
- case WBUserVerifyTypeClub: {
- _avatarBadgeView.hidden = NO;
- _avatarBadgeView.image = [WBStatusHelper imageNamed:@"avatar_grassroot"];
- } break;
- default: {
- _avatarBadgeView.hidden = YES;
- } break;
- }
- }
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- _trackingTouch = NO;
- UITouch *t = touches.anyObject;
- CGPoint p = [t locationInView:_avatarView];
- if (CGRectContainsPoint(_avatarView.bounds, p)) {
- _trackingTouch = YES;
- }
- p = [t locationInView:_nameLabel];
- if (CGRectContainsPoint(_nameLabel.bounds, p) && _nameLabel.textLayout.textBoundingRect.size.width > p.x) {
- _trackingTouch = YES;
- }
- if (!_trackingTouch) {
- [super touchesBegan:touches withEvent:event];
- }
- }
- - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- if (!_trackingTouch) {
- [super touchesEnded:touches withEvent:event];
- } else {
- if ([_cell.delegate respondsToSelector:@selector(cell:didClickUser:)]) {
- [_cell.delegate cell:_cell didClickUser:_cell.statusView.layout.status.user];
- }
- }
- }
- - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- if (!_trackingTouch) {
- [super touchesCancelled:touches withEvent:event];
- }
- }
- @end
- @implementation WBStatusCardView {
- BOOL _isRetweet;
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- if (frame.size.width == 0 && frame.size.height == 0){
- frame.size.width = kScreenWidth;
- frame.origin.x = kWBCellPadding;
- }
- self = [super initWithFrame:frame];
- self.exclusiveTouch = YES;
-
- _imageView = [UIImageView new];
- _imageView.clipsToBounds = YES;
- _imageView.contentMode = UIViewContentModeScaleAspectFill;
- _badgeImageView = [UIImageView new];
- _badgeImageView.clipsToBounds = YES;
- _badgeImageView.contentMode = UIViewContentModeScaleAspectFit;
- _label = [YYLabel new];
- _label.textVerticalAlignment = YYTextVerticalAlignmentCenter;
- _label.numberOfLines = 3;
- _label.ignoreCommonProperties = YES;
- _label.displaysAsynchronously = YES;
- _label.fadeOnAsynchronouslyDisplay = NO;
- _label.fadeOnHighlight = NO;
- _button = [UIButton buttonWithType:UIButtonTypeCustom];
- [self addSubview:_imageView];
- [self addSubview:_badgeImageView];
- [self addSubview:_label];
- [self addSubview:_button];
- self.backgroundColor = kWBCellInnerViewColor;
- self.layer.borderWidth = CGFloatFromPixel(1);
- self.layer.borderColor = [UIColor colorWithWhite:0.000 alpha:0.070].CGColor;
- return self;
- }
- - (void)setWithLayout:(WBStatusLayout *)layout isRetweet:(BOOL)isRetweet {
- WBPageInfo *pageInfo = isRetweet ? layout.status.retweetedStatus.pageInfo : layout.status.pageInfo;
- if (!pageInfo) return;
- self.height = isRetweet ? layout.retweetCardHeight : layout.cardHeight;
-
- /*
- badge: 25,25 左上角 (42)
- image: 70,70 方形
- 100, 70 矩形
- btn: 60,70
-
- lineheight 20
- padding 10
- */
-
- _isRetweet = isRetweet;
- switch (isRetweet ? layout.retweetCardType : layout.cardType) {
- case WBStatusCardTypeNone: {
-
- } break;
- case WBStatusCardTypeNormal: {
- self.width = kWBCellContentWidth;
- if (pageInfo.typeIcon) {
- _badgeImageView.hidden = NO;
- _badgeImageView.frame = CGRectMake(0, 0, 25, 25);
- [_badgeImageView setImageWithURL:pageInfo.typeIcon placeholder:nil];
- } else {
- _badgeImageView.hidden = YES;
- }
- if (pageInfo.pagePic) {
- _imageView.hidden = NO;
- if (pageInfo.typeIcon) {
- _imageView.frame = CGRectMake(0, 0, 100, 70);
- } else {
- _imageView.frame = CGRectMake(0, 0, 70, 70);
- }
- [_imageView setImageWithURL:pageInfo.pagePic placeholder:nil];
- } else {
- _imageView.hidden = YES;
- }
- _label.hidden = NO;
- _label.frame = isRetweet ? layout.retweetCardTextRect : layout.cardTextRect;
- _label.textLayout = isRetweet ? layout.retweetCardTextLayout : layout.cardTextLayout;
- WBButtonLink *button = pageInfo.buttons.firstObject;
- if (button.pic && button.name) {
- _button.hidden = NO;
- _button.size = CGSizeMake(60, 70);
- _button.top = 0;
- _button.right = self.width;
- [_button setTitle:button.name forState:UIControlStateNormal];
- [_button setImageWithURL:button.pic forState:UIControlStateNormal placeholder:nil];
- } else {
- _button.hidden = YES;
- }
- }break;
- case WBStatusCardTypeVideo: {
- self.width = self.height;
- _badgeImageView.hidden = YES;
- _label.hidden = YES;
- _imageView.frame = self.bounds;
- [_imageView setImageWithURL:pageInfo.pagePic options:kNilOptions];
- _button.hidden = NO;
- _button.frame = self.bounds;
- [_button setTitle:nil forState:UIControlStateNormal];
- [_button cancelImageRequestForState:UIControlStateNormal];
- [_button setImage:[WBStatusHelper imageNamed:@"multimedia_videocard_play"] forState:UIControlStateNormal];
-
- } break;
- default: {
-
- } break;
- }
-
- self.backgroundColor = isRetweet ? [UIColor whiteColor] : kWBCellInnerViewColor;
- }
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- self.backgroundColor = kWBCellInnerViewHighlightColor;
- }
- - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- self.backgroundColor = _isRetweet ? [UIColor whiteColor] : kWBCellInnerViewColor;
- if ([_cell.delegate respondsToSelector:@selector(cellDidClickCard:)]) {
- [_cell.delegate cellDidClickCard:_cell];
- }
- }
- - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- self.backgroundColor = _isRetweet ? [UIColor whiteColor] : kWBCellInnerViewColor;
- }
- @end
- @implementation WBStatusToolbarView
- - (instancetype)initWithFrame:(CGRect)frame {
- if (frame.size.width == 0 && frame.size.height == 0) {
- frame.size.width = kScreenWidth;
- frame.size.height = kWBCellToolbarHeight;
- }
- self = [super initWithFrame:frame];
- self.exclusiveTouch = YES;
-
- _repostButton = [UIButton buttonWithType:UIButtonTypeCustom];
- _repostButton.exclusiveTouch = YES;
- _repostButton.size = CGSizeMake(CGFloatPixelRound(self.width / 3.0), self.height);
- [_repostButton setBackgroundImage:[UIImage imageWithColor:kWBCellHighlightColor] forState:UIControlStateHighlighted];
-
- _commentButton = [UIButton buttonWithType:UIButtonTypeCustom];
- _commentButton.exclusiveTouch = YES;
- _commentButton.size = CGSizeMake(CGFloatPixelRound(self.width / 3.0), self.height);
- _commentButton.left = CGFloatPixelRound(self.width / 3.0);
- [_commentButton setBackgroundImage:[UIImage imageWithColor:kWBCellHighlightColor] forState:UIControlStateHighlighted];
-
- _likeButton = [UIButton buttonWithType:UIButtonTypeCustom];
- _likeButton.exclusiveTouch = YES;
- _likeButton.size = CGSizeMake(CGFloatPixelRound(self.width / 3.0), self.height);
- _likeButton.left = CGFloatPixelRound(self.width / 3.0 * 2.0);
- [_likeButton setBackgroundImage:[UIImage imageWithColor:kWBCellHighlightColor] forState:UIControlStateHighlighted];
-
- _repostImageView = [[UIImageView alloc] initWithImage:[WBStatusHelper imageNamed:@"timeline_icon_retweet"]];
- _repostImageView.centerY = self.height / 2;
- [_repostButton addSubview:_repostImageView];
- _commentImageView = [[UIImageView alloc] initWithImage:[WBStatusHelper imageNamed:@"timeline_icon_comment"]];
- _commentImageView.centerY = self.height / 2;
- [_commentButton addSubview:_commentImageView];
- _likeImageView = [[UIImageView alloc] initWithImage:[WBStatusHelper imageNamed:@"timeline_icon_unlike"]];
- _likeImageView.centerY = self.height / 2;
- [_likeButton addSubview:_likeImageView];
-
- _repostLabel = [YYLabel new];
- _repostLabel.userInteractionEnabled = NO;
- _repostLabel.height = self.height;
- _repostLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
- _repostLabel.displaysAsynchronously = YES;
- _repostLabel.ignoreCommonProperties = YES;
- _repostLabel.fadeOnHighlight = NO;
- _repostLabel.fadeOnAsynchronouslyDisplay = NO;
- [_repostButton addSubview:_repostLabel];
-
- _commentLabel = [YYLabel new];
- _commentLabel.userInteractionEnabled = NO;
- _commentLabel.height = self.height;
- _commentLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
- _commentLabel.displaysAsynchronously = YES;
- _commentLabel.ignoreCommonProperties = YES;
- _commentLabel.fadeOnHighlight = NO;
- _commentLabel.fadeOnAsynchronouslyDisplay = NO;
- [_commentButton addSubview:_commentLabel];
-
- _likeLabel = [YYLabel new];
- _likeLabel.userInteractionEnabled = NO;
- _likeLabel.height = self.height;
- _likeLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
- _likeLabel.displaysAsynchronously = YES;
- _likeLabel.ignoreCommonProperties = YES;
- _likeLabel.fadeOnHighlight = NO;
- _likeLabel.fadeOnAsynchronouslyDisplay = NO;
- [_likeButton addSubview:_likeLabel];
-
- UIColor *dark = [UIColor colorWithWhite:0 alpha:0.2];
- UIColor *clear = [UIColor colorWithWhite:0 alpha:0];
- NSArray *colors = @[(id)clear.CGColor,(id)dark.CGColor, (id)clear.CGColor];
- NSArray *locations = @[@0.2, @0.5, @0.8];
-
- _line1 = [CAGradientLayer layer];
- _line1.colors = colors;
- _line1.locations = locations;
- _line1.startPoint = CGPointMake(0, 0);
- _line1.endPoint = CGPointMake(0, 1);
- _line1.size = CGSizeMake(CGFloatFromPixel(1), self.height);
- _line1.left = _repostButton.right;
-
- _line2 = [CAGradientLayer layer];
- _line2.colors = colors;
- _line2.locations = locations;
- _line2.startPoint = CGPointMake(0, 0);
- _line2.endPoint = CGPointMake(0, 1);
- _line2.size = CGSizeMake(CGFloatFromPixel(1), self.height);
- _line2.left = _commentButton.right;
-
- _topLine = [CALayer layer];
- _topLine.size = CGSizeMake(self.width, CGFloatFromPixel(1));
- _topLine.backgroundColor = kWBCellLineColor.CGColor;
-
- _bottomLine = [CALayer layer];
- _bottomLine.size = _topLine.size;
- _bottomLine.bottom = self.height;
- _bottomLine.backgroundColor = UIColorHex(e8e8e8).CGColor;
-
- [self addSubview:_repostButton];
- [self addSubview:_commentButton];
- [self addSubview:_likeButton];
- [self.layer addSublayer:_line1];
- [self.layer addSublayer:_line2];
- [self.layer addSublayer:_topLine];
- [self.layer addSublayer:_bottomLine];
-
- @weakify(self);
- [_repostButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
- WBStatusCell *cell = weak_self.cell;
- if ([cell.delegate respondsToSelector:@selector(cellDidClickRepost:)]) {
- [cell.delegate cellDidClickRepost:cell];
- }
- }];
-
- [_commentButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
- WBStatusCell *cell = weak_self.cell;
- if ([cell.delegate respondsToSelector:@selector(cellDidClickComment:)]) {
- [cell.delegate cellDidClickComment:cell];
- }
- }];
-
- [_likeButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
- WBStatusCell *cell = weak_self.cell;
- if ([cell.delegate respondsToSelector:@selector(cellDidClickLike:)]) {
- [cell.delegate cellDidClickLike:cell];
- }
- }];
- return self;
- }
- - (void)setWithLayout:(WBStatusLayout *)layout {
- _repostLabel.width = layout.toolbarRepostTextWidth;
- _commentLabel.width = layout.toolbarCommentTextWidth;
- _likeLabel.width = layout.toolbarLikeTextWidth;
-
- _repostLabel.textLayout = layout.toolbarRepostTextLayout;
- _commentLabel.textLayout = layout.toolbarCommentTextLayout;
- _likeLabel.textLayout = layout.toolbarLikeTextLayout;
-
- [self adjustImage:_repostImageView label:_repostLabel inButton:_repostButton];
- [self adjustImage:_commentImageView label:_commentLabel inButton:_commentButton];
- [self adjustImage:_likeImageView label:_likeLabel inButton:_likeButton];
-
- _likeImageView.image = layout.status.attitudesStatus ? [self likeImage] : [self unlikeImage];
- }
- - (UIImage *)likeImage {
- static UIImage *img;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- img = [WBStatusHelper imageNamed:@"timeline_icon_like"];
- });
- return img;
- }
- - (UIImage *)unlikeImage {
- static UIImage *img;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- img = [WBStatusHelper imageNamed:@"timeline_icon_unlike"];
- });
- return img;
- }
- - (void)adjustImage:(UIImageView *)image label:(YYLabel *)label inButton:(UIButton *)button {
- CGFloat imageWidth = image.bounds.size.width;
- CGFloat labelWidth = label.width;
- CGFloat paddingMid = 5;
- CGFloat paddingSide = (button.width - imageWidth - labelWidth - paddingMid) / 2.0;
- image.centerX = CGFloatPixelRound(paddingSide + imageWidth / 2);
- label.right = CGFloatPixelRound(button.width - paddingSide);
- }
- - (void)setLiked:(BOOL)liked withAnimation:(BOOL)animation {
- WBStatusLayout *layout = _cell.statusView.layout;
- if (layout.status.attitudesStatus == liked) return;
-
- UIImage *image = liked ? [self likeImage] : [self unlikeImage];
- int newCount = layout.status.attitudesCount;
- newCount = liked ? newCount + 1 : newCount - 1;
- if (newCount < 0) newCount = 0;
- if (liked && newCount < 1) newCount = 1;
- NSString *newCountDesc = newCount > 0 ? [WBStatusHelper shortedNumberDesc:newCount] : @"赞";
-
- UIFont *font = [UIFont systemFontOfSize:kWBCellToolbarFontSize];
- YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(kScreenWidth, kWBCellToolbarHeight)];
- container.maximumNumberOfRows = 1;
- NSMutableAttributedString *likeText = [[NSMutableAttributedString alloc] initWithString:newCountDesc];
- likeText.font = font;
- likeText.color = liked ? kWBCellToolbarTitleHighlightColor : kWBCellToolbarTitleColor;
- YYTextLayout *textLayout = [YYTextLayout layoutWithContainer:container text:likeText];
-
- layout.status.attitudesStatus = liked;
- layout.status.attitudesCount = newCount;
- layout.toolbarLikeTextLayout = textLayout;
-
- if (!animation) {
- _likeImageView.image = image;
- _likeLabel.width = CGFloatPixelRound(textLayout.textBoundingRect.size.width);
- _likeLabel.textLayout = layout.toolbarLikeTextLayout;
- [self adjustImage:_likeImageView label:_likeLabel inButton:_likeButton];
- return;
- }
-
- [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut animations:^{
- _likeImageView.layer.transformScale = 1.7;
- } completion:^(BOOL finished) {
-
- _likeImageView.image = image;
- _likeLabel.width = CGFloatPixelRound(textLayout.textBoundingRect.size.width);
- _likeLabel.textLayout = layout.toolbarLikeTextLayout;
- [self adjustImage:_likeImageView label:_likeLabel inButton:_likeButton];
-
- [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut animations:^{
- _likeImageView.layer.transformScale = 0.9;
- } completion:^(BOOL finished) {
- [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut animations:^{
- _likeImageView.layer.transformScale = 1;
- } completion:^(BOOL finished) {
- }];
- }];
- }];
- }
- @end
- @implementation WBStatusTagView
- - (instancetype)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- @weakify(self);
- _button = [UIButton buttonWithType:UIButtonTypeCustom];
- [_button setBackgroundImage:[UIImage imageWithColor:kWBCellBackgroundColor] forState:UIControlStateNormal];
- [_button setBackgroundImage:[UIImage imageWithColor:[UIColor colorWithWhite:0.000 alpha:0.200]] forState:UIControlStateHighlighted];
- [_button addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
- if ([weak_self.cell.delegate respondsToSelector:@selector(cellDidClickTag:)]) {
- [weak_self.cell.delegate cellDidClickTag:weak_self.cell];
- }
- }];
- _button.hidden = YES;
- [self addSubview:_button];
-
- _label = [YYLabel new];
- _label.textVerticalAlignment = YYTextVerticalAlignmentCenter;
- _label.displaysAsynchronously = YES;
- _label.ignoreCommonProperties = YES;
- _label.fadeOnHighlight = NO;
- _label.fadeOnAsynchronouslyDisplay = NO;
- _label.highlightTapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
- if ([weak_self.cell.delegate respondsToSelector:@selector(cell:didClickInLabel:textRange:)]) {
- [weak_self.cell.delegate cell:weak_self.cell didClickInLabel:(YYLabel *)containerView textRange:range];
- }
- };
- [self addSubview:_label];
-
- _imageView = [UIImageView new];
- _imageView.size = CGSizeMake(kWBCellTagPlaceHeight, kWBCellTagPlaceHeight);
- _imageView.image = [WBStatusHelper imageNamed:@"timeline_icon_locate"];
- _imageView.hidden = YES;
- [self addSubview:_imageView];
-
- _label.height = kWBCellTagPlaceHeight;
- _button.height = kWBCellTagPlaceHeight;
- self.height = kWBCellTagPlaceHeight;
- return self;
- }
- - (void)setWithLayout:(WBStatusLayout *)layout {
- if (layout.tagType == WBStatusTagTypePlace) {
- _label.height = kWBCellTagPlaceHeight;
- _imageView.hidden = NO;
- _button.hidden = NO;
-
- _label.left = _imageView.right + 6;
- _label.width = layout.tagTextLayout.textBoundingRect.size.width + 6;
- _label.textLayout = layout.tagTextLayout;
- _label.userInteractionEnabled = NO;
-
- self.width = _label.right;
- _label.width = self.width;
- _button.width = self.width;
- } else if (layout.tagType == WBStatusTagTypeNormal) {
- _imageView.hidden = YES;
- _button.hidden = YES;
-
- _label.left = 0;
- _label.width = layout.tagTextLayout.textBoundingRect.size.width + 1;
- _label.userInteractionEnabled = YES;
- _label.textLayout = layout.tagTextLayout;
- }
- }
- @end
- @implementation WBStatusView {
- BOOL _touchRetweetView;
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- if (frame.size.width == 0 && frame.size.height == 0) {
- frame.size.width = kScreenWidth;
- frame.size.height = 1;
- }
- self = [super initWithFrame:frame];
- self.backgroundColor = [UIColor clearColor];
- self.exclusiveTouch = YES;
- @weakify(self);
-
- _contentView = [UIView new];
- _contentView.width = kScreenWidth;
- _contentView.height = 1;
- _contentView.backgroundColor = [UIColor whiteColor];
- static UIImage *topLineBG, *bottomLineBG;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- topLineBG = [UIImage imageWithSize:CGSizeMake(1, 3) drawBlock:^(CGContextRef context) {
- CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
- CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 0.8, [UIColor colorWithWhite:0 alpha:0.08].CGColor);
- CGContextAddRect(context, CGRectMake(-2, 3, 4, 4));
- CGContextFillPath(context);
- }];
- bottomLineBG = [UIImage imageWithSize:CGSizeMake(1, 3) drawBlock:^(CGContextRef context) {
- CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
- CGContextSetShadowWithColor(context, CGSizeMake(0, 0.4), 2, [UIColor colorWithWhite:0 alpha:0.08].CGColor);
- CGContextAddRect(context, CGRectMake(-2, -2, 4, 2));
- CGContextFillPath(context);
- }];
- });
- UIImageView *topLine = [[UIImageView alloc] initWithImage:topLineBG];
- topLine.width = _contentView.width;
- topLine.bottom = 0;
- topLine.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
- [_contentView addSubview:topLine];
-
-
- UIImageView *bottomLine = [[UIImageView alloc] initWithImage:bottomLineBG];
- bottomLine.width = _contentView.width;
- bottomLine.top = _contentView.height;
- bottomLine.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
- [_contentView addSubview:bottomLine];
- [self addSubview:_contentView];
-
- _titleView = [WBStatusTitleView new];
- _titleView.hidden = YES;
- [_contentView addSubview:_titleView];
-
- _profileView = [WBStatusProfileView new];
- [_contentView addSubview:_profileView];
-
- _vipBackgroundView = [UIImageView new];
- _vipBackgroundView.size = CGSizeMake(kScreenWidth, 14.0);
- _vipBackgroundView.top = -2;
- _vipBackgroundView.contentMode = UIViewContentModeTopRight;
- [_contentView addSubview:_vipBackgroundView];
-
-
- _menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
- _menuButton.size = CGSizeMake(30, 30);
- [_menuButton setImage:[WBStatusHelper imageNamed:@"timeline_icon_more"] forState:UIControlStateNormal];
- [_menuButton setImage:[WBStatusHelper imageNamed:@"timeline_icon_more_highlighted"] forState:UIControlStateHighlighted];
- _menuButton.centerX = self.width - 20;
- _menuButton.centerY = 18;
- [_menuButton addBlockForControlEvents:UIControlEventTouchUpInside block:^(id sender) {
- if ([weak_self.cell.delegate respondsToSelector:@selector(cellDidClickMenu:)]) {
- [weak_self.cell.delegate cellDidClickMenu:weak_self.cell];
- }
- }];
- [_contentView addSubview:_menuButton];
-
- _retweetBackgroundView = [UIView new];
- _retweetBackgroundView.backgroundColor = kWBCellInnerViewColor;
- _retweetBackgroundView.width = kScreenWidth;
- [_contentView addSubview:_retweetBackgroundView];
-
- _textLabel = [YYLabel new];
- _textLabel.left = kWBCellPadding;
- _textLabel.width = kWBCellContentWidth;
- _textLabel.textVerticalAlignment = YYTextVerticalAlignmentTop;
- _textLabel.displaysAsynchronously = YES;
- _textLabel.ignoreCommonProperties = YES;
- _textLabel.fadeOnAsynchronouslyDisplay = NO;
- _textLabel.fadeOnHighlight = NO;
- _textLabel.highlightTapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
- if ([weak_self.cell.delegate respondsToSelector:@selector(cell:didClickInLabel:textRange:)]) {
- [weak_self.cell.delegate cell:weak_self.cell didClickInLabel:(YYLabel *)containerView textRange:range];
- }
- };
- [_contentView addSubview:_textLabel];
-
- _retweetTextLabel = [YYLabel new];
- _retweetTextLabel.left = kWBCellPadding;
- _retweetTextLabel.width = kWBCellContentWidth;
- _retweetTextLabel.textVerticalAlignment = YYTextVerticalAlignmentTop;
- _retweetTextLabel.displaysAsynchronously = YES;
- _retweetTextLabel.ignoreCommonProperties = YES;
- _retweetTextLabel.fadeOnAsynchronouslyDisplay = NO;
- _retweetTextLabel.fadeOnHighlight = NO;
- _retweetTextLabel.highlightTapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
- if ([weak_self.cell.delegate respondsToSelector:@selector(cell:didClickInLabel:textRange:)]) {
- [weak_self.cell.delegate cell:weak_self.cell didClickInLabel:(YYLabel *)containerView textRange:range];
- }
- };
- [_contentView addSubview:_retweetTextLabel];
-
- NSMutableArray *picViews = [NSMutableArray new];
- for (int i = 0; i < 9; i++) {
- YYControl *imageView = [YYControl new];
- imageView.size = CGSizeMake(100, 100);
- imageView.hidden = YES;
- imageView.clipsToBounds = YES;
- imageView.backgroundColor = kWBCellHighlightColor;
- imageView.exclusiveTouch = YES;
- imageView.touchBlock = ^(YYControl *view, YYGestureRecognizerState state, NSSet *touches, UIEvent *event) {
- if (![weak_self.cell.delegate respondsToSelector:@selector(cell:didClickImageAtIndex:)]) return;
- if (state == YYGestureRecognizerStateEnded) {
- UITouch *touch = touches.anyObject;
- CGPoint p = [touch locationInView:view];
- if (CGRectContainsPoint(view.bounds, p)) {
- [weak_self.cell.delegate cell:weak_self.cell didClickImageAtIndex:i];
- }
- }
- };
-
- UIView *badge = [UIImageView new];
- badge.userInteractionEnabled = NO;
- badge.contentMode = UIViewContentModeScaleAspectFit;
- badge.size = CGSizeMake(56 / 2, 36 / 2);
- badge.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin;
- badge.right = imageView.width;
- badge.bottom = imageView.height;
- badge.hidden = YES;
- [imageView addSubview:badge];
-
- [picViews addObject:imageView];
- [_contentView addSubview:imageView];
- }
- _picViews = picViews;
-
- _cardView = [WBStatusCardView new];
- _cardView.hidden = YES;
- [_contentView addSubview:_cardView];
-
- _tagView = [WBStatusTagView new];
- _tagView.left = kWBCellPadding;
- _tagView.hidden = YES;
- [_contentView addSubview:_tagView];
-
- _toolbarView = [WBStatusToolbarView new];
- [_contentView addSubview:_toolbarView];
-
- return self;
- }
- - (void)setLayout:(WBStatusLayout *)layout {
- _layout = layout;
-
- self.height = layout.height;
- _contentView.top = layout.marginTop;
- _contentView.height = layout.height - layout.marginTop - layout.marginBottom;
-
- CGFloat top = 0;
- if (layout.titleHeight > 0) {
- _titleView.hidden = NO;
- _titleView.height = layout.titleHeight;
- _titleView.titleLabel.textLayout = layout.titleTextLayout;
- top = layout.titleHeight;
- } else {
- _titleView.hidden = YES;
- }
-
- /// 圆角头像
- [_profileView.avatarView setImageWithURL:layout.status.user.avatarLarge //profileImageURL
- placeholder:nil
- options:kNilOptions
- manager:[WBStatusHelper avatarImageManager] //< 圆角头像manager,内置圆角处理
- progress:nil
- transform:nil
- completion:nil];
- _profileView.nameLabel.textLayout = layout.nameTextLayout;
- _profileView.sourceLabel.textLayout = layout.sourceTextLayout;
- _profileView.verifyType = layout.status.user.userVerifyType;
- _profileView.height = layout.profileHeight;
- _profileView.top = top;
- top += layout.profileHeight;
- NSURL *picBg = [WBStatusHelper defaultURLForImageURL:layout.status.picBg];
- __weak typeof(_vipBackgroundView) vipBackgroundView = _vipBackgroundView;
- [_vipBackgroundView setImageWithURL:picBg placeholder:nil options:YYWebImageOptionAvoidSetImage completion:^(UIImage *image, NSURL *url, YYWebImageFromType from, YYWebImageStage stage, NSError *error) {
- if (image) {
- image = [UIImage imageWithCGImage:image.CGImage scale:2.0 orientation:image.imageOrientation];
- vipBackgroundView.image = image;
- }
- }];
-
- _textLabel.top = top;
- _textLabel.height = layout.textHeight;
- _textLabel.textLayout = layout.textLayout;
- top += layout.textHeight;
-
-
-
- _retweetBackgroundView.hidden = YES;
- _retweetTextLabel.hidden = YES;
- _cardView.hidden = YES;
- if (layout.picHeight == 0 && layout.retweetPicHeight == 0) {
- [self _hideImageViews];
- }
-
-
- //优先级是 转发->图片->卡片
- if (layout.retweetHeight > 0) {
- _retweetBackgroundView.top = top;
- _retweetBackgroundView.height = layout.retweetHeight;
- _retweetBackgroundView.hidden = NO;
-
- _retweetTextLabel.top = top;
- _retweetTextLabel.height = layout.retweetTextHeight;
- _retweetTextLabel.textLayout = layout.retweetTextLayout;
- _retweetTextLabel.hidden = NO;
-
- if (layout.retweetPicHeight > 0) {
- [self _setImageViewWithTop:_retweetTextLabel.bottom isRetweet:YES];
- } else {
- [self _hideImageViews];
- if (layout.retweetCardHeight > 0) {
- _cardView.top = _retweetTextLabel.bottom;
- _cardView.hidden = NO;
- [_cardView setWithLayout:layout isRetweet:YES];
- }
- }
- } else if (layout.picHeight > 0) {
- [self _setImageViewWithTop:top isRetweet:NO];
- } else if (layout.cardHeight > 0) {
- _cardView.top = top;
- _cardView.hidden = NO;
- [_cardView setWithLayout:layout isRetweet:NO];
- }
-
- if (layout.tagHeight > 0) {
- _tagView.hidden = NO;
- [_tagView setWithLayout:layout];
- _tagView.centerY = _contentView.height - kWBCellToolbarHeight - layout.tagHeight / 2;
- } else {
- _tagView.hidden = YES;
- }
-
-
- _toolbarView.bottom = _contentView.height;
- [_toolbarView setWithLayout:layout];
- }
- - (void)_hideImageViews {
- for (UIImageView *imageView in _picViews) {
- imageView.hidden = YES;
- }
- }
- - (void)_setImageViewWithTop:(CGFloat)imageTop isRetweet:(BOOL)isRetweet {
- CGSize picSize = isRetweet ? _layout.retweetPicSize : _layout.picSize;
- NSArray *pics = isRetweet ? _layout.status.retweetedStatus.pics : _layout.status.pics;
- int picsCount = (int)pics.count;
-
- for (int i = 0; i < 9; i++) {
- UIView *imageView = _picViews[i];
- if (i >= picsCount) {
- [imageView.layer cancelCurrentImageRequest];
- imageView.hidden = YES;
- } else {
- CGPoint origin = {0};
- switch (picsCount) {
- case 1: {
- origin.x = kWBCellPadding;
- origin.y = imageTop;
- } break;
- case 4: {
- origin.x = kWBCellPadding + (i % 2) * (picSize.width + kWBCellPaddingPic);
- origin.y = imageTop + (int)(i / 2) * (picSize.height + kWBCellPaddingPic);
- } break;
- default: {
- origin.x = kWBCellPadding + (i % 3) * (picSize.width + kWBCellPaddingPic);
- origin.y = imageTop + (int)(i / 3) * (picSize.height + kWBCellPaddingPic);
- } break;
- }
- imageView.frame = (CGRect){.origin = origin, .size = picSize};
- imageView.hidden = NO;
- [imageView.layer removeAnimationForKey:@"contents"];
- WBPicture *pic = pics[i];
-
- UIView *badge = imageView.subviews.firstObject;
- switch (pic.largest.badgeType) {
- case WBPictureBadgeTypeNone: {
- if (badge.layer.contents) {
- badge.layer.contents = nil;
- badge.hidden = YES;
- }
- } break;
- case WBPictureBadgeTypeLong: {
- badge.layer.contents = (__bridge id)([WBStatusHelper imageNamed:@"timeline_image_longimage"].CGImage);
- badge.hidden = NO;
- } break;
- case WBPictureBadgeTypeGIF: {
- badge.layer.contents = (__bridge id)([WBStatusHelper imageNamed:@"timeline_image_gif"].CGImage);
- badge.hidden = NO;
- } break;
- }
-
- @weakify(imageView);
- [imageView.layer setImageWithURL:pic.bmiddle.url
- placeholder:nil
- options:YYWebImageOptionAvoidSetImage
- completion:^(UIImage *image, NSURL *url, YYWebImageFromType from, YYWebImageStage stage, NSError *error) {
- @strongify(imageView);
- if (!imageView) return;
- if (image && stage == YYWebImageStageFinished) {
- int width = pic.bmiddle.width;
- int height = pic.bmiddle.height;
- CGFloat scale = (height / width) / (imageView.height / imageView.width);
- if (scale < 0.99 || isnan(scale)) { // 宽图把左右两边裁掉
- imageView.contentMode = UIViewContentModeScaleAspectFill;
- imageView.layer.contentsRect = CGRectMake(0, 0, 1, 1);
- } else { // 高图只保留顶部
- imageView.contentMode = UIViewContentModeScaleToFill;
- imageView.layer.contentsRect = CGRectMake(0, 0, 1, (float)width / height);
- }
- ((YYControl *)imageView).image = image;
- if (from != YYWebImageFromMemoryCacheFast) {
- CATransition *transition = [CATransition animation];
- transition.duration = 0.15;
- transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
- transition.type = kCATransitionFade;
- [imageView.layer addAnimation:transition forKey:@"contents"];
- }
- }
- }];
- }
- }
- }
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- UITouch *touch = touches.anyObject;
- CGPoint p = [touch locationInView:_retweetBackgroundView];
- BOOL insideRetweet = CGRectContainsPoint(_retweetBackgroundView.bounds, p);
-
- if (!_retweetBackgroundView.hidden && insideRetweet) {
- [(_retweetBackgroundView) performSelector:@selector(setBackgroundColor:) withObject:kWBCellHighlightColor afterDelay:0.15];
- _touchRetweetView = YES;
- } else {
- [(_contentView) performSelector:@selector(setBackgroundColor:) withObject:kWBCellHighlightColor afterDelay:0.15];
- _touchRetweetView = NO;
- }
- }
- - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- [self touchesRestoreBackgroundColor];
- if (_touchRetweetView) {
- if ([_cell.delegate respondsToSelector:@selector(cellDidClickRetweet:)]) {
- [_cell.delegate cellDidClickRetweet:_cell];
- }
- } else {
- if ([_cell.delegate respondsToSelector:@selector(cellDidClick:)]) {
- [_cell.delegate cellDidClick:_cell];
- }
- }
- }
- - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
- [self touchesRestoreBackgroundColor];
- }
- - (void)touchesRestoreBackgroundColor {
- [NSObject cancelPreviousPerformRequestsWithTarget:_retweetBackgroundView selector:@selector(setBackgroundColor:) object:kWBCellHighlightColor];
- [NSObject cancelPreviousPerformRequestsWithTarget:_contentView selector:@selector(setBackgroundColor:) object:kWBCellHighlightColor];
-
- _contentView.backgroundColor = [UIColor whiteColor];
- _retweetBackgroundView.backgroundColor = kWBCellInnerViewColor;
- }
- @end
- @implementation WBStatusCell
- - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
- self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
- _statusView = [WBStatusView new];
- _statusView.cell = self;
- _statusView.titleView.cell = self;
- _statusView.profileView.cell = self;
- _statusView.cardView.cell = self;
- _statusView.toolbarView.cell = self;
- _statusView.tagView.cell = self;
- [self.contentView addSubview:_statusView];
- return self;
- }
- - (void)prepareForReuse {
- // ignore
- }
- - (void)setLayout:(WBStatusLayout *)layout {
- self.height = layout.height;
- self.contentView.height = layout.height;
- _statusView.layout = layout;
- }
- @end
|