步骤:首页14-时间 -> 首页15-来源 -> 首页16-配图相册 -> 首页17-头像

首页14-时间

通过新浪官方的APP可知,在微博发送时间上是这么分类的:

/**1.今年1> 今天* 1分内: 刚刚* 1分~59分内:xx分钟前* 大于60分钟:xx小时前2> 昨天* 昨天 xx:xx3> 其他* xx-xx xx:xx2.非今年1> xxxx-xx-xx xx:xx*/作者:dibadalu
链接:https://www.jianshu.com/p/fff763f14093
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考官方的APP后,在HMStatus模型中重写created_at的getter方法,判断时间并返回所定义的时间格式。具体代码如下:

/***  重写get方法*/
- (NSString *)created_at
{NSDateFormatter *fmt = [[NSDateFormatter alloc] init];//如果是真机调试,转换欧美时间,需要设置localefmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];//设置日期格式(声明字符串里面每个数字和单词的含义)  @"Tue Sep 30 17:06:25 +0800 2014";fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";//微博的创建时间NSDate *createDate = [fmt dateFromString:_created_at];//当前时间NSDate *now = [NSDate date];//日历对象(方便比较两个日期之间的差距)NSCalendar *calendar = [NSCalendar currentCalendar];//NSCalendarUnit枚举代表想获得哪些差值NSCalendarUnit unit =NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;//计算2个日期之间的差值NSDateComponents *cmps = [calendar components:unit fromDate:createDate toDate:now options:0];//判断时间if ([createDate isThisYear]) {//今年if ([createDate isYesterday]) {//昨天fmt.dateFormat = @"昨天 HH:mm";return [fmt stringFromDate:createDate];}else if ([createDate isToday]){if (cmps.hour > 1) {//大于1小时return [NSString stringWithFormat:@"%ld小时前",cmps.hour];}else if (cmps.minute > 1){//大于1分钟return [NSString stringWithFormat:@"%ld分钟前",cmps.minute];}else{//1分钟内return @"刚刚";}}else{//今年的其他日子fmt.dateFormat = @"MM-dd HH:mm";return [fmt stringFromDate:createDate];}}else{//非今年fmt.dateFormat = @"yyyy-MM-dd HH:mm";return [fmt stringFromDate:createDate];}
}

注意:其中,时间的具体判断方法封装在NSDate的Category(NSDate+Extension)中,如下:

首页15-来源

从前文可知,除了时间需要重新定义格式,来源也需要重新定义格式(原本是一个href链接)。
一旦来源确定后,之后不会多次调用,所以这里只需要对HMStatus模型的Source重写setter方法即可。如下:

- (void)setSource:(NSString *)source
{// 范例 <a href="http://weibo.com/" rel="nofollow">微博 weibo.com</a>//截取字符串//如果出现警告:reason: '-[__NSCFConstantString substringWithRange:]: Range {9223372036854775808, 18446744073709551615} out of bounds; string lenght 0,//原因:猜测是api的限制导致的//做法:先判断source的lengthif (source.length != 0) {NSRange range = NSMakeRange(0, 0);range.location = [source rangeOfString:@">"].location + 1;//    range.length = [source rangeOfString:@"</"].location - range.location;range.length = [source rangeOfString:@"<" options:NSBackwardsSearch].location - range.location;_source = [NSString stringWithFormat:@"来自%@",[source substringWithRange:range]];}}

注意:按照前文的所定义的时间格式,每条微博都随着时间而改变,created_at的getter方法会多次调用,时间所占用的frame也会随着改变,时间的frame的改变会影响来源的frame。所以在自定义cell的类HMStatusCell的setStatusFrame:方法中,要完善时间与来源的有关代码,如下:

APP的界面:

首页16-配图相册

APP操作演示:

从APP的操作演示中可知,原创微博或转发微博的配图数量不定,可能有1-9张等多种情况。前文中,在自定义cell的类HMStatusCell的setStatusFrame:方法中,配图所在位置只是一个UIImageView,只能存放一张图片。现在,要新建一个继承自UIView的HMStatusPhotosView类,作为配图相册,存放1-9张图片。
HMStatusPhotosView类只需要把属性photos和计算整个配图相册的尺寸方法提供给外界使用,而如何设置配图相册里的图片及其frame、计算整个配图相册的尺寸都封装该类里。封装的具体代码如下:

至于外界,只需要通过以下的代码就可以轻松使用上面所封装的代码,从而设置配图相册。

在HMStatusCell的setStatusFrame:方法中,设置配图,如下:

如果仔细观察APP操作演示里的配图,可以发现有些图片在图片的右下角会显示gif表明是gif格式。
实际上,在上文设置图片相册里的图片的封装代码中,新建了一个名为HMStatusPhotoView类来存放每一张单独的图片,而gif图片控件的显示或隐藏就交给HMStatusPhotoView类自己判断,不需要让外界知道。
HMStatusPhotoView.m的具体代码如下:

首页17-头像

APP的界面:

从新浪官方微博可知,有些头像的右下角会有特别的认证标志。
在HMUser模型中,声明新的属性-认证类型。
如下:

认证类型通过枚举来区分,如下:

新建一个继承自UIImageView的HMIconView来显示认证类型标志。
HMIconView类的两个关键方法如下:

总结:时间和来源要注意区分getter和setter方法的使用。配图相册要活用hidden属性控制图片控件的显示或隐藏。另外一定要把子控件的frame计算放在layoutSubviews方法中。

学习HM微博项目第7天相关推荐

  1. 学习HM微博项目第1天

    步骤:搭建基本环境 -> 展示子控制器 -> 项目分层 -> 增加导航功能 -> 增加导航栏按钮. 搭建基本环境 该项目使用代码搭建UI界面,所以在HMAppDelegate的 ...

  2. 学习HM微博项目第10天

    步骤:发微博12-表情键盘06-点击表情 -> 发微博13-表情键盘07-插入表情和封装textView -> 发微博14-表情键盘08-长按表情 -> 发微博15-表情键盘09-最 ...

  3. 学习HM微博项目第2天

    步骤:导航栏主题 -> 添加搜索框 -> 易混淆的属性 -> 自定义搜索框 -> 标题按钮 -> 弹出下拉菜单 -> 封装下拉菜单 导航栏主题 在HMNavigat ...

  4. 学习HM微博项目第9天

    步骤:发微博07-表情键盘01-切换键盘 -> 发微博08-表情键盘02-表情工具条 -> 发微博09-表情键盘03-加载表情数据和切换表情按钮 -> 发微博10-表情键盘04-表情 ...

  5. 学习HM微博项目第8天

    步骤:发微博01-导航栏内容 -> 发微博02-自定义TextView -> 发微博03-完善TextView和发送微博按钮 -> 发微博04-显示工具条 -> 发微博05-封 ...

  6. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  7. 后盾vip php框架,后盾网实战VIP教程之ThinkPHP微博项目系列培训

    php教程 当前位置:主页 > php教程 > 后盾网实战VIP教程之ThinkPHP微博项目系列培训 后盾网实战VIP教程之ThinkPHP微博项目系列培训 教程大小:1.56GB   ...

  8. 如何用 Python 进行基于深度学习的计算机视觉项目开发?

    令人惊喜的"智能"年代 深度学习有着广阔的前景 我们正处在一个"智能"的年代,比如智能手机中的语音助手.机器翻译和人脸识别:战胜过日本将棋冠军.国际象棋冠军, ...

  9. No module named MNIST_写给小白的用fashion-mnist入门机器学习和深度学习的简单项目(非常全面!!!)...

    这是一个入门机器学习和深度学习的小项目,以fashion-mnist数据为基础.分别利用机器学习(随机森林)和深度学习(多层感知机/卷积神经网络)方法进行训练.完整的包含数据读取,数据处理,训练, 验 ...

最新文章

  1. 科大星云诗社动态20211202
  2. SQLServer数据库访问帮助类
  3. oracle11g AUD$维护
  4. 软件质量包括哪些特性?软件质量保证的主要任务是什么?
  5. css 透明度_如何在网页控制透明度
  6. 【10.9】每日NLP学术论文推荐
  7. 设计模式系列--Singleton
  8. UNP Chapter 3 - 套接口编程简介
  9. 有监督学习,无监督学习,强化学习总结
  10. 作业:欧拉公式以及凉鞋问题
  11. NodeMCU文档中文翻译 6 MQTT模块
  12. matlab求导函数作图,excel对数据求导作图/如何用excel计算导数
  13. 015-包、crate、模块
  14. 现代版的———项链 :(  转
  15. clojure 开发工具_Clojure Web开发–最新技术–第2部分
  16. python阶梯图_不会你还不懂怎么用Python制图吧?师兄教你如何学会绘制漂亮的阶梯图...
  17. 目标检测与位姿估计(五):A Survey: Visual Place Recognition
  18. LHS 查询和 RHS 查询
  19. 【独行秀才】macOS Big Sur 11.5 正式版(20G71)原版镜像
  20. SwaggerUI增加公共的Global全局Header

热门文章

  1. 第二天 echo语句与分界符EOF
  2. Python turtle绘制多彩同心圆
  3. 阿里云docker源设置
  4. 【ElementUI】使用VNode调整Message消息提示
  5. [JS 分析] 邮箱地址加密 [email protected]
  6. 万兆交换机与千兆交换机的区别有哪些?
  7. python类中包含类_彻底搞懂Python中的类
  8. Linux内核学习(五):linux kernel源码结构以及makefile分析
  9. windbg符号表路劲设置成功后没有自动下载
  10. 四、golang类型讲解--go语言学习笔记