功能实现一

最近有个界面需求长这样;

屏幕快照 2017-03-22 11.10.31.png

刚开始拿到这个界面的时候,我就懵逼了,这咋整啊;得,再怎么懵逼也得继续啊;

一,思路:

整体来说,先给他扣个tableView吧,剩下的也就是怎么处理tableViewCell了;再细看,整个cell有两部分组成,一部分是主评论,一部分是副评论;主评论还好说,3个label,1个imageView;副评论就不行了,这副评论还是变化的,这可怎么办?

1,再细看,副评论也就是固定样式的view的个数;想想自适应高度是不行了,只能看看如何得到高度,然后根据得到的高度来处理了;

2,副评论如何放在整个cell上面;

二,看来要获得整个cell的高度,少不了计算了,那么如何计算,以及如何让计算最可能的优化;之前是了解了下YYKit框架,我想也许我能在子线程中计算整个我需要的height,再有一点,YYkit使用的是轻量级的layer,由于整个项目使用的masonry,并且我也不大想每个都计算,于是通过在拿到数据model的时候,我顺便计算了我想要的几个label的高度,至于其他的就是美工给的固定尺寸了;

解1: 这里我在子线程中初始化一个带有modellayout类,用来计算了我所需要的所有高度的数据;

LTYYCommentModel *model = [LTYYCommentModel yy_modelWithJSON:dic];
//这里传入了model和cellWidth,根据这两个数据我就可以计算所有我想要的高度;
[strongSelf.layoutsOfTableView addObject:[[LTYYCommentLayout alloc] initWithCommentModel:model withCellWidth:SCREEN_WIDTH - 20]];

如果不是太严谨的话,有时我只考虑了宽度的适配,毕竟大部分的view都是放在scrollView上展示的;

解2:副评论,我考虑的是把他打包好了,竟然都是一样的,那我就考虑是一个View中放了若干个unitView;由unitView的个数决定View的高度和hidden;这样是可以实现,这个又有个问题了,我不想频繁的initaddremove;那么如何实现unitView的复用呢?想想可以把用到的unitView存起来,下次只要刷新label.textimageView.image就可以啦,

@interface LTSubCommentUnit(){
    
    UIImageView * _proImageView;
    
    UILabel * _commentLabel;
    
}

@end

@implementation LTSubCommentUnit

- (instancetype)initWithModel:(LTYYReplyCommentModel *)model{
    self = [super init];
    if (self) {
        _model = model;
        _proImageView = [[UIImageView alloc] init];
        _proImageView.layer.cornerRadius = 12 * kScaleNum;
        _proImageView.layer.masksToBounds = YES;
        [self addSubview:_proImageView];
        _commentLabel = [[UILabel alloc] init];
        _commentLabel.numberOfLines = 0;
        [self addSubview:_commentLabel];
        [self updateData];
        
        
    }
    return self;
}

- (void)setModel:(LTYYReplyCommentModel *)model{
    _model = model;
    [self updateData];
}

- (void)updateData{
    [_proImageView setImageWithURL:_model.portrait.url placeholderImage:[UIImage imageNamed:@"metou"]];
    NSString *comment = [NSString stringWithFormat:@"%@ : %@", _model.nickname, _model.replyContent];
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:comment attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12], NSForegroundColorAttributeName : HexColor(0xb3b3b3)}];
    [attrStr setAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12],NSForegroundColorAttributeName : HexColor(0x666666)} range:NSMakeRange(0, _model.nickname.length)];
    _commentLabel.attributedText = attrStr;
}

- (void)layoutSubviews{
    _proImageView.frame = CGRectMake(43, 4, 24, 24);
    _commentLabel.frame = CGRectMake(CGRectGetMaxX(_proImageView.frame) + 11, 10, self.width - (CGRectGetMaxX(_proImageView.frame) + 11 + 40), self.height - 10 * 2);
}

@end

@implementation LTSubCommentView
//赋值给副评论的model,刷新数据,当前array中如果没有unit,就再创建一个;
- (void)setReplyArray:(NSArray<LTYYReplyCommentModel *> *)replyArray{
    _replyArray = replyArray;
    for (int i = 0; i < replyArray.count; i ++) {
        if (i < self.units.count) {
            LTSubCommentUnit *unit = self.units[i];
            unit.model = replyArray[i];
        }else{
            LTSubCommentUnit *unit = [[LTSubCommentUnit alloc] initWithModel:replyArray[i]];
            [self addSubview:unit];
            [self.units addObject:unit];
        }
    }
}

唯一有点遗憾的是,我将unitView存储在array中,howwhen,让array释放掉多余的unitView

三,紧接着就是如何实现‘显示更多’和‘隐藏更多’,

1,我知道tableView有一个方法- (void)reloadRowAtIndexPath:(NSIndexPath *)indexPath withRowAnimation:(UITableViewRowAnimation)animation;可以加载指定的行;需要注意到的是这个reload,并不是复用这个cell,而是将旧的cell移除,新new一个cell;之前老是要点击两次,也就是这个原因了,方法的英文解释也有说明,只怪当时没注意到;

2,鉴于第一条,我就着重改变下现有tableView的数据data了,于是我在上面提到的layout类中,添加了一个属性,BOOL hidenMore用来告诉我们是否显示2个以上的副评论,并重新计算了指定的几个height;

3,鉴于第二条我又遇到了几个问题:
     1>如何监听基本数据类型;我在方法中执行下面的方法,可惜并没有效果:
      这里可以重写setter和getter方法来实现监听:

- (void)setAge:(NSInteger)age{
 [self willChangeValueForKey:@"age"];
 NSValue *value = [NSValue value:&age withObjCType:@encode(NSInteger)];
 objc_setAssociatedObject(self, _cmd, value, OBJC_ASSOCIATION_RETAIN);
 [self didChangeValueForKey:@"age"];
}

- (NSInteger)age{
 //不明白这里为什么可以使用{0}
 NSInteger result = {0};
 NSValue *value = objc_getAssociatedObject(self, @selector(setAge:));
 [value getValue:&result];
 return result;
}

- (void)setCommentLayout:(LTYYCommentLayout *)commentLayout{
 
//    if (_commentLayout != commentLayout && _commentLayout) {
//        [_commentLayout removeObserver:self forKeyPath:@"hideMore"];
//    }
 
 _commentLayout = commentLayout;
 self.subHeights = commentLayout.subComHeights;
 self.replyArray = commentLayout.model.replyData;
 self.hideMore = commentLayout.hidenMore;
 //监听commentLayout的hidemore变化
//    [_commentLayout addObserver:self forKeyPath:@"hideMore" options:NSKeyValueObservingOptionNew context:nil];
}

//- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
//    
//    if ([keyPath isEqualToString:@"hideMore"]) {
//        self.hideMore = [object boolValue];
//    }
//}

//- (void)dealloc{
//    [self.commentLayout removeObserver:self forKeyPath:@"hideMore"];
//}

2>接着1,我在dealloc注销监听的时候,在界面来回切换,崩溃,cxx什么的,这里有篇孙源的文章:ARC下dealloc过程及.cxx_destruct的探究

今天先写这点,后续我再看看补充些,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 原文地址:http://www.jianshu.com/p/9fc838d46f5e 在日常的开发中,有时会遇到内...
    默默_David阅读 1,307评论 0 12
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,321评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 我们在上一篇《通过代码自定义不等高cell》中学习了tableView的相关知识,本文将在上文的基础上,利用sto...
    啊世ka阅读 1,495评论 2 7
  • (夜睡不好)更深二点人未觉,来杯温水助眠意。眠思梦想早点睡,夜睡不好身体差。为何黑夜长慢慢,为何总是不眼累。越是夜...
    甘朝武阅读 153评论 0 0