前言

项目中需要实现类似朋友圈动态的列表,需要用到图文混排,正好可以使用ibireme大神的开源控件YYText实现这种效果,在这里记录一下使用过程中遇到的问题,参考文章iOS 保持界面流畅的技巧。

布局

列表中的主要布局如下图所示,预先将每个cell的高度计算出来,并且将高度缓存下来,不重复计算高度。ibireme实现的微博列表Demo写的已经很清晰了,这里主要写下自己在使用时,遇到的一些问题。

1.TableView刷新时出现闪动问题

TableView在刷新的时候,YYLabel会出现闪动,解决方法是将异步绘制关闭displaysAsynchronously = NO;,参考https://github.com/ibireme/YYKit/issues/64。

2.动态Label默认最多显示六行

计算文本的行数,YYTextContainer有最大行数maximumNumberOfRows属性,根据这个属性可以设置文本最大行数。

    YYTextContainer *container = [YYTextContainer new];container.size = CGSizeMake(kWBCellContentWidth, HUGE);container.linePositionModifier = modifier;//计算文本的行数,判断显示6行,还是显示完全YYTextLayout *tmpTextLayout = [YYTextLayout layoutWithContainer:container text:text];NSUInteger rowCount = tmpTextLayout.rowCount;
复制代码

当行数大于6行时,显示展开按钮,点击展开按钮显示全部文本,显示收起按钮,将当前最大行数设置为6行。

     //判断是否隐藏展开按钮if (rowCount > 6) {_isShowExpendButton = YES;//判断展开或者收起状态if (_isExpend == NO) {container.maximumNumberOfRows = 6;_expendButtonTitle = @"全文";}else{_expendButtonTitle = @"收起";}}else{_isShowExpendButton = NO;}
复制代码
3.匹配字符串

将动态字符串中的[呵呵] ,[可爱]等字符串替换为表情图片。将电话号码,网址等进行高亮显示,并且为其设置userInfo,用于后面响应用户点击事件。将这些方法放在了NSString+Emotion类中,方便调用。关于正则表达式怎么匹配,可以查看这篇文章从零开始学习正则表达式。

    // 匹配 [表情]NSArray<NSTextCheckingResult *> *emoticonResults = [[EmoticonHelper regexEmoticon] matchesInString:text.string options:kNilOptions range:text.yy_rangeOfAll];NSUInteger emoClipLength = 0;for (NSTextCheckingResult *emo in emoticonResults) {if (emo.range.location == NSNotFound && emo.range.length <= 1) continue;NSRange range = emo.range;range.location -= emoClipLength;if ([text yy_attribute:YYTextHighlightAttributeName atIndex:range.location]) continue;if ([text yy_attribute:YYTextAttachmentAttributeName atIndex:range.location]) continue;NSString *emoString = [text.string substringWithRange:range];NSString *imagePath = [EmoticonHelper emoticonDic][emoString];UIImage *image = [EmoticonHelper imageWithPath:imagePath];if (!image) continue;NSAttributedString *emoText = [NSAttributedString yy_attachmentStringWithEmojiImage:image fontSize:font.pointSize];[text replaceCharactersInRange:range withAttributedString:emoText];//emoText的length都是1emoClipLength += range.length - 1;}
复制代码

响应手机号和网址的点击事件,获取高亮状态字符串的userInfo,然后进行相应的操作。

/// 点击了 Label 的链接
- (void)cell:(TwitterCell *)cell didClickInLabel:(YYLabel *)label textRange:(NSRange)textRange{NSAttributedString *text = label.textLayout.text;if (textRange.location >= text.length) return;YYTextHighlight *highlight = [text yy_attribute:YYTextHighlightAttributeName atIndex:textRange.location];NSDictionary *info = highlight.userInfo;if (info.count == 0) return;if (info[kWBLinkURLName]) {[[UIApplication sharedApplication] openURL:[NSURL URLWithString:info[kWBLinkURLName]]];}else if (info[KWBLinkPhone]){NSMutableString *str2=[[NSMutableString alloc] initWithFormat:@"tel:%@",info[KWBLinkPhone]];UIWebView * callWebview = [[UIWebView alloc] init];[callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str2]]];[self.view addSubview:callWebview];}
}
复制代码
4.评论列表点击可以拷贝

评论视图是用UITableView实现的,可以使用TableView的系统方法,实现长按cell,弹出copy菜单,然后进行复制[UIPasteboard generalPasteboard].string = model.comment

- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath {return YES;
}- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {if (action == @selector(copy:)) {return YES;}return NO;
}- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {if (action == @selector(copy:)) {TweetCommentModel *model;if (self.commentArray.count > 0) {model  = self.commentArray[indexPath.row];}[UIPasteboard generalPasteboard].string = model.comment;}
}
复制代码

YYKit中微博Demo的表情键盘,自己也照着作者的代码敲了一篇,学到了很多。

最后代码可以到动态列表,表情键盘下载。

实现微信朋友圈动态列表相关推荐

  1. 仿微信朋友圈动态列表

    仿微信朋友圈动态列表,如下图: Demo下载

  2. python抓取朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)...

    原标题:如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下) 前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往 ...

  3. 如何写出高效的软件测试用例?微信朋友圈动态发送为例

    编写一份好的测试用例需要:充分的需求分析能力 + 理论及经验加持. 但这并不意味着,没测试经验.分析能力弱就不能写好用例,还是有方法可循的.作为混迹测试职场 10 年的老人,给大家分享一些用例编写的心 ...

  4. 一文教你写出高效的软件测试用例!微信朋友圈动态发送为例

    编写一份好的测试用例需要:充分的需求分析能力 + 理论及经验加持. 但这并不意味着,没测试经验.分析能力弱就不能写好用例,还是有方法可循的.作为混迹测试职场 10 年的老人,给大家分享一些用例编写的心 ...

  5. 微信朋友圈消息列表html,微信,怎么查看朋友圈以前的评论消息?

    原标题:微信,怎么查看朋友圈以前的评论消息? 怎么在微信里面找到好友之前和我们之间互动留下的评论?也就是说微信朋友圈回复的消息列表在哪呢? 经常玩微信的朋友就知道通常如果好友评论或者赞了自已的动态及你 ...

  6. Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。

    转载请注明出处: http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动 ...

  7. python抓取微信朋友圈动态_2018最全如何利用Python网络爬虫抓取微信朋友圈的动态...

    今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门.不过不要慌 ...

  8. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  9. python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

最新文章

  1. Quick-cocos2d-x3.3 Study (十五)--------- 为小鸟添加一个物理加速度
  2. 【课件】基础雷达信号处理
  3. MyBatis-Plus selectMapsPage报错
  4. 如何在大学和工作后让自己逐渐变强?
  5. Tomcat forward debug - how is jsp file served in Tomcat
  6. 【单元测试框架unittest】
  7. Jmeter 老司机带你一小时学会Jmeter
  8. SQL数据库高级查询命令(3)
  9. 多类目MoE模型在京东电商搜索中的应用
  10. 全栈开发工程师微信小程序-上(中)
  11. 图像变换——对数变换
  12. c# winform 让Form窗体上系统自带的红色关闭按钮失效,点击关闭变为隐藏
  13. 如何将Android手机用作调制解调器; 无需生根,Redux
  14. 小白能读懂的 《手把手教你学DSP(TMS320X281X)》第六章 时钟和系统控制
  15. 《你是三月的小桨》光剑
  16. 加载配置文件(xml文件,properties文件)demo
  17. Pytorch练习--绘制Loss曲线
  18. centos 虚拟机出问题 Oh no,something has gone wrong! 解决方法
  19. 在你眼中,人生最重要的是什么?
  20. 宁静、万茜等姐姐们“乘风破浪”,各品牌借势掀起新一波火热营销

热门文章

  1. linux python连接oracle数据库_Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法...
  2. blob转成json js_javascript – 文件API – Blob到JSON
  3. opencore0.6.4_心灵终结3.3.4
  4. mysql5.1.6安装_mysql 5.1.6的安装启动
  5. basys2数码管共阳还是共阴_数据选择器Multiplexer || 数码管动态显示 ||实现逻辑函数 || 重难考点 || 数电...
  6. c语言程序设计和数据结构,C语言程序设计与数据结构实践 闵光太主编.pdf
  7. centos nginx重启_nginx学习笔记
  8. 24点游戏java_24点游戏动态规划解法(java)
  9. MySQL数据库序列的作用_MySQL数据库:序列使用
  10. c语言尖括号 注释,关于C语言include尖括号和双引号的对话