iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示
一.上拉下拉注意事项
- 使用MJRefresh中的上拉控件自动设置透明

- 当请求下页数据通过page的时候,注意的是上拉加载更多数据失败的问题,下拉加载数据失败了,页数应该还原.或者是请求成功的时候再将页数修改

二.帖子中的日期显示问题(操作日期的两个类的使用)
期望达到的效果:如图

<1>NSDate -- 需要通过NSDateFormatter(日期格式类)将日期转换成相同的格式,才能相互运算,计算出来的时间间隔是以秒数来呈现的.
<2>NSCalendar(日历类)
- -- 通过当前的Calendar对象可以获取日历中的组件(例如:时 分 秒 等等)

- -- 也可以计算两个日期之间的差值

<3>项目中给NSDate扩展了一个分类,来计算两个时间之间的差值的方法;判断是否今年的方法;判断是否今天的方法;判断是否昨天的方法
#import "NSDate+ChaosExtension.h" @implementation NSDate (ChaosExtension) - (NSDateComponents *)deltaFromDate:(NSDate *)from
{
// 当前的日历对象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 要获取的单元
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; // 获取计算出差值的日期组件
NSDateComponents *cmpt = [calendar components:unit fromDate:from toDate:self options:];
return cmpt;
}
// 是否今年
- (BOOL)isThisYear
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger nowYear = [calendar component:NSCalendarUnitYear fromDate:[NSDate date]];
NSInteger selfYear = [calendar component:NSCalendarUnitYear fromDate:self];
return nowYear == selfYear;
}
// 是否是今天,年月日 都要比较
- (BOOL)isToday
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents *nowCmpt = [calendar components:unit fromDate:[NSDate date]];
NSDateComponents *selfCmpt = [calendar components:unit fromDate:self];
return nowCmpt.year == selfCmpt.year
&& nowCmpt.month == selfCmpt.month
&& nowCmpt.day == selfCmpt.day;
} - (BOOL)isYesterday
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents *nowCmpt = [calendar components:unit fromDate:[NSDate date]];
NSDateComponents *selfCmpt = [calendar components:unit fromDate:self];
return nowCmpt.year == selfCmpt.year
&& nowCmpt.month == selfCmpt.month
&& nowCmpt.day - selfCmpt.day == ;
} @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 > ) { // 时间间隔 > 一小时
timeStr = [NSString stringWithFormat:@"%zd小时前",cmpt.hour];
} else if (cmpt.minute > ) { // 一小时 > 时间间隔 > 一分钟
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的高度
// cell的高度
- (CGFloat)cellHeight
{
if (!_cellHeight) { // 文本框的Y值
CGFloat labelY = ChaosCellHeadImageH + * ChaosMargin;
// 文本框的宽度
CGFloat labelW = [UIScreen mainScreen].bounds.size.width - * ChaosMargin; CGSize size = CGSizeMake(labelW, CGFLOAT_MAX);
// 文本框的高度 -- 重点 options要用对
CGFloat labelH = [_text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14.0]} context:nil].size.height;
// cell高度
_cellHeight = labelY + labelH + ChaosCellBottomBarH + * ChaosMargin; if (_type == ChaosTopicTypePicture) { // 图片 // 计算图片显示的宽度
CGFloat pictureW = labelW;
// 计算图片显示的高度
CGFloat pictureH = pictureW * self.height / self.width; // 判断图片是否过长
if (pictureH >= ChaosCellPictureMaxH) {
self.bigPicture = YES;
// 限制高度
pictureH = ChaosCellPictureOverMaxH;
} else {
self.bigPicture = NO;
} // 计算图片的Y值
CGFloat pictureY = labelY + labelH + ChaosMargin;
_pictureFrame = CGRectMake(ChaosMargin, pictureY, pictureW, pictureH);
_cellHeight = labelY + labelH + ChaosCellBottomBarH + * ChaosMargin + pictureH + ChaosMargin;
}
}
return _cellHeight;
}
五.图片帖子的显示

- 在计算cell高度的的时候,将图片显示的高度算出来.并算出图片的frame,给模型扩展一个pictureFrame属性来存储图片的frame

- cell中判断类型,创建相应的xib,并添加,这里添加的是图片,就是上图用xib来描述的

iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示的更多相关文章
- iOS不得姐项目--登录模块的布局,设置文本框占位文字颜色,自定义内部控件竖直排列的按钮
一.登录模块的布局 将一整部分切割成若干部分来完成,如图分成了三部分来完成 设置顶部状态栏为白色的方法 二.设置文本框占位文字颜色 <1>方法一与方法二实现原理是同一种,都是通过设置pla ...
- iOS不得姐项目--推荐关注模块(一个控制器控制两个tableView),数据重复请求的问题,分页数据的加载,上拉下拉刷新(MJRefresh)
一.推荐关注模块(一个控制器控制两个tableView) -- 数据的显示 刚开始加载数据值得注意的有以下几点 导航控制器会自动调整scrollView的contentInset,最好是取消系统的设置 ...
- swift实现UItableview上拉下拉刷新模块
最近用写个项目 发现上拉下拉刷新模块没找到合适的 so 自己写了一个 由于最近忙 教程就不写了 里面有 直接贴地址https://github.com/DaChengTechnology/DCRefr ...
- ListView实现上拉下拉刷新加载功能
第一步.首先在你项目中创建一个包存放支持下拉刷新和上拉加载的类:
- 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题
博客已迁移至http://zlwis.me. 使用过iscroll.js的上拉下拉刷新效果的朋友应该都碰到过这个问题:在iOS的浏览器中,上拉或下拉刷新时,当手指划出屏幕后,页面无法弹回.很多人因为解 ...
- 打造Android万能上拉下拉刷新框架--XRefreshView(三)
转载请注明出处:http://blog.csdn.net/footballclub/ 打造Android万能上拉下拉刷新框架–XRefreshView(一) 打造Android万能上拉下拉刷新框架–X ...
- 练习使用XRecyclerView,可上拉下拉刷新。
package com.lixu.testxrecyclerview; import android.support.v7.app.AppCompatActivity; import android. ...
- 打造android万能上拉下拉刷新框架——XRefreshView (二)
打造Android万能上拉下拉刷新框架--XRefreshView(一) 打造Android万能上拉下拉刷新框架--XRefreshView(三) 一.前言 自从上次发表了打造android万能上拉下 ...
- GPIO端口上拉下拉 与 硬件图的上拉下拉
硬件图上的上拉下拉: 没有触发时默认接到IO的是高电平就是上拉: 没有触发时默认接到IO的是低电平就是 下拉: (2)对应GPIO的配置 配置与你的外围电路息息相关: 比如下图: 你只能配置为上拉: ...
随机推荐
- 将域名从GODADDY转移到namesilo
1.首先登陆Godaddy的网站http://www.godaddy.com,登陆到后台控制面板,选择要转移的域名 如图所示,进入域名控制面板 2.对域名进行解锁,如果不进行解锁的话,域名是无法进行转 ...
- 《JavaScript权威指南 第六版 中文版》(一)
<JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...
- jmeter 中的 HTTP URL Re-writing Modifier
URL rewriting modifier,因为tomcat的session实现不是通过cookie的,而是通过session id的,就是说,用户登录有了session之后,tomcat就会维护一 ...
- jsonobject 遍历 org.json.JSONObject
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public static ...
- PAT 1016. 部分A+B (15)
正整数A的"DA(为1位整数)部分"定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的"6部分"PA是66,因为A中有 ...
- Spring 3.x jar 包详解 与 依赖关系
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval
需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...
- [转]考虑 PHP 5.0~5.6 各版本兼容性的 cURL 文件上传
FROM : https://segmentfault.com/a/1190000000725185 最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件. ...
- [xen]XenServer6.2增加第二块盘&vm开启自动启动&图形化安装centos
很多服务器都会多块盘或者做了Raid的多个虚拟磁盘,而安装xenserver后,他只会默认挂载第一快盘,也就是安装xenServer系统的那块. 为XenServer6.2挂载/增加第二块硬盘的方法 ...
- Eclipse工作常见问题总结
一.Eclipse常见快捷键使用 自动完成单词:Alt+/ 重命名:Shift+Alt+r(统一改变字段或方法名) 生成getter/setter方法: Shift+Alt+s,然后r 删除当前行:C ...