一.上拉下拉注意事项

  • 使用MJRefresh中的上拉控件自动设置透明
  • 当请求下页数据通过page的时候,注意的是上拉加载更多数据失败的问题,下拉加载数据失败了,页数应该还原.或者是请求成功的时候再将页数修改

二.帖子中的日期显示问题(操作日期的两个类的使用)

期望达到的效果:如图

  <1>NSDate -- 需要通过NSDateFormatter(日期格式类)将日期转换成相同的格式,才能相互运算,计算出来的时间间隔是以秒数来呈现的.

  <2>NSCalendar(日历类)

  • -- 通过当前的Calendar对象可以获取日历中的组件(例如:时 分 秒 等等)
  • -- 也可以计算两个日期之间的差值

  <3>项目中给NSDate扩展了一个分类,来计算两个时间之间的差值的方法;判断是否今年的方法;判断是否今天的方法;判断是否昨天的方法

 1 #import "NSDate+ChaosExtension.h"
 2
 3 @implementation NSDate (ChaosExtension)
 4
 5 - (NSDateComponents *)deltaFromDate:(NSDate *)from
 6 {
 7     // 当前的日历对象
 8     NSCalendar *calendar = [NSCalendar currentCalendar];
 9     // 要获取的单元
10     NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
11
12     // 获取计算出差值的日期组件
13     NSDateComponents *cmpt = [calendar components:unit fromDate:from toDate:self options:0];
14     return cmpt;
15 }
16 // 是否今年
17 - (BOOL)isThisYear
18 {
19     NSCalendar *calendar = [NSCalendar currentCalendar];
20     NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
21     NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];
22     return nowYear == selfYear;
23 }
24 // 是否是今天,年月日 都要比较
25 - (BOOL)isToday
26 {
27     NSCalendar *calendar = [NSCalendar currentCalendar];
28     NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
29     NSDateComponents *nowCmpt = [calendar components:unit fromDate:[NSDate date]];
30     NSDateComponents *selfCmpt = [calendar components:unit fromDate:self];
31     return nowCmpt.year == selfCmpt.year
32     && nowCmpt.month == selfCmpt.month
33     && nowCmpt.day == selfCmpt.day;
34 }
35
36 - (BOOL)isYesterday
37 {
38     NSCalendar *calendar = [NSCalendar currentCalendar];
39     NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
40     NSDateComponents *nowCmpt = [calendar components:unit fromDate:[NSDate date]];
41     NSDateComponents *selfCmpt = [calendar components:unit fromDate:self];
42     return nowCmpt.year == selfCmpt.year
43     && nowCmpt.month == selfCmpt.month
44     && nowCmpt.day - selfCmpt.day == 1;
45 }
46
47 @end

  • 重写了模型中创建时间这个属性
- (NSString *)create_time
{NSString *timeStr = nil;NSDateFormatter *fmt = [[NSDateFormatter alloc] init];fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";NSDate *date = [fmt dateFromString:_create_time];if (date.isThisYear) { // 今年if (date.isToday) { // 今天
            NSDateComponents *cmpt = [[NSDate date] deltaFromDate:date];ChaosLog(@"%zd %zd %zd",cmpt.hour,cmpt.minute,cmpt.second);if (cmpt.hour > 1) { // 时间间隔 > 一小时timeStr = [NSString stringWithFormat:@"%zd小时前",cmpt.hour];} else if (cmpt.minute > 1) { // 一小时 > 时间间隔 > 一分钟timeStr = [NSString stringWithFormat:@"%zd分钟前",cmpt.minute];} else { // 一分钟 > 时间间隔timeStr = @"刚刚";}} else if (date.isYesterday) { // 昨天fmt.dateFormat = @"昨天 HH:mm:ss";timeStr = [fmt stringFromDate:date];} else { // 其他fmt.dateFormat = @"MM-dd HH:mm:ss";timeStr = [fmt stringFromDate:date];}} else { // 非今年timeStr = _create_time;}return timeStr;
}

三.重构子控制器 -- 项目中的视频帖子,音频帖子,图片帖子,段子帖子等,实现的代码几乎一样,不一样的地方就是向服务器请求的类型.简化方法:

<1>继承,抽出一个父类

<2>直接用一个类,在这个类中添加一个'类型'的属性,向服务器请求数据的时候用对应子控制器的'类型' -- 项目中采用了这个方法(好处,减少了N个类)

四.计算cell的高度(重点是根据文本和文本显示的宽度来计算文本的高度)

  • 不好的做法 -- 在代理方法中计算cell高度,缺点是:每次都要计算
  • 推荐做法:-- 每个模型对应一个cell,每个cell都有自己的高度,所以在模型中扩展了cellHeight属性来存储自己模型cell的高度
 1 // cell的高度
 2 - (CGFloat)cellHeight
 3 {
 4     if (!_cellHeight) {
 5
 6         // 文本框的Y值
 7         CGFloat labelY = ChaosCellHeadImageH + 2 * ChaosMargin;
 8         // 文本框的宽度
 9         CGFloat labelW = [UIScreen mainScreen].bounds.size.width - 4 * ChaosMargin;
10
11         CGSize size = CGSizeMake(labelW, CGFLOAT_MAX);
12         // 文本框的高度 -- 重点 options要用对
13         CGFloat labelH = [_text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14.0]} context:nil].size.height;
14         // cell高度
15         _cellHeight = labelY + labelH + ChaosCellBottomBarH + 2 * ChaosMargin;
16
17         if (_type == ChaosTopicTypePicture) { // 图片
18
19             // 计算图片显示的宽度
20             CGFloat pictureW = labelW;
21             // 计算图片显示的高度
22             CGFloat pictureH = pictureW * self.height / self.width;
23
24             // 判断图片是否过长
25             if (pictureH >= ChaosCellPictureMaxH) {
26                 self.bigPicture = YES;
27                 // 限制高度
28                 pictureH = ChaosCellPictureOverMaxH;
29             } else {
30                 self.bigPicture = NO;
31             }
32
33             // 计算图片的Y值
34             CGFloat pictureY = labelY + labelH + ChaosMargin;
35             _pictureFrame = CGRectMake(ChaosMargin, pictureY, pictureW, pictureH);
36             _cellHeight = labelY + labelH + ChaosCellBottomBarH + 2 * ChaosMargin + pictureH + ChaosMargin;
37         }
38     }
39     return _cellHeight;
40 }

五.图片帖子的显示

    

  • 在计算cell高度的的时候,将图片显示的高度算出来.并算出图片的frame,给模型扩展一个pictureFrame属性来存储图片的frame
  • cell中判断类型,创建相应的xib,并添加,这里添加的是图片,就是上图用xib来描述的

iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示...相关推荐

  1. iOS开发 仿陌陌首页上拉下拉效果

    这几天产品小弟说要把首页做成像陌陌的首页,作为一个程序员本来是想剁了他的,但是考虑到最近工作不好找,就忍了的... 陌陌首页分析: 陌陌操作图.gif 陌陌首页长这样 往上推的时候明显感觉是下面的盖住 ...

  2. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  3. 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题

    解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题 参考文章: (1)解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题 (2)https://www.cnblogs.co ...

  4. LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView

    LtRecyclerView:自带上拉下拉,能增加头条目和尾条目的RecyclerView 点击查看2.x版本,功能更强大 主要功能: 自带上拉加载和下拉刷新 可以添加100条头条目和尾条目(其实是可 ...

  5. gpio上拉下拉区别

    gpio上拉下拉区别 GPIO是一颗芯片(MCU)必须具备的最基本外设功能. GPIO通常有三种状态:高电平.低电平和高阻态.高阻态换句话说就是断开状态或浮空态.因此上拉和下拉其中一个强大的理由就是为 ...

  6. 三极管的上拉下拉电阻的选取

    输出端的接电源或接地的电阻叫上拉.下拉电阻,而基极电阻不叫这个名称,应该叫基极偏置电路分压电阻. 根据基极所需的偏置电压以及电源电压大小,用电阻分压公式计算Ub=Vcc*R2/(R1+R2),电阻值的 ...

  7. 关于GPIO上拉下拉和高低电平的问题

    https://blog.csdn.net/yinghaijushi/article/details/78991999 这篇文章讲的不错,主要是对于引脚的电平,一开始设置的是默认的状态,平时即一开始, ...

  8. STM32芯片IO口的配置以及上拉下拉电阻介绍(一)

    STM32芯片IO口的配置以及上拉下拉电阻介绍(一) IO口常见的配置方式 推挽输出 开漏输出 STM32芯片做硬件研发的朋友们都知道.但是还是有很多做硬件的新朋友"只知其然而不知其所然&q ...

  9. rs485接口上下拉_关于RS485上拉下拉电阻的说明

    关于 RS485 上拉下拉电阻的说明 一.上拉下拉电阻作用: 接电阻就是为了防止输入端悬空 减弱外部电流对芯片产生的干扰 保护 cmos 内的保护二极管 , 一般电流不大于 10mA 上拉和下拉.限流 ...

  10. 单片机IO输出,上拉下拉电阻,图腾柱,线与

    在讲上拉下拉之前先,先讲讲什么是强1强0,高阻态,弱1弱0: 图一 如图可见:所谓强1,就是output直接接到vcc上,这样可以保证output后的器件的高电平识别门限,输出电平逻辑可以保证为1:同 ...

最新文章

  1. 写个Vue小组件,图片滚动
  2. Python中关于‘self’的种种用法笔记
  3. 谷歌浏览器mac_Mac用户浏览网页不可少的浏览器-谷歌Chrome
  4. 如何正确解码用户的“玄学需求”?
  5. html图片爆炸效果,利用CSS3制作3D图片爆炸效果
  6. 回流Reflow和重绘Repaint
  7. 爪哇国新游记之二十六----迷宫寻路
  8. jquery 下拉选择框/复选框常用操作
  9. 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
  10. 【渝粤教育】国家开放大学2018年春季 3922T汽车运用基础 参考试题
  11. 统计学基础知识有哪些?看这一篇就够了
  12. codeforces379a Alyona and mex
  13. [Obsidian]懒人必备插件附使用教程
  14. 网上书店系统/书店管理系统的设计与实现
  15. 地图缓存和动态地图服务
  16. 生产服务器的pcie错误
  17. 基于OFBiz的E-TICKET(在线咨询管理)模块
  18. 微信公众号自定义回复文字菜单-----详细教程
  19. [Swift A] - 实战-豆瓣电台总结
  20. Laya Class

热门文章

  1. Spring 的 IOC原理
  2. 0002-标题段落-前端学习笔记
  3. OAUI前台设计(二)
  4. 文件系统[HDU-1413]
  5. 动态解析dll及使用类
  6. 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)...
  7. fjnuoj 1004 游戏 (博弈论)
  8. asp.net 页面跳转的方法
  9. 机器学习基础:K近邻算法(Machine Learning Fundamentals: KNN)
  10. 截获webView点击事件