iBistu4.0(新闻)
数据源
获取新闻列表数据
接口:http://api.iflab.org/api/v2/newsapi/newslist
请求方法:get
参数:category
:必需参数,新闻分类,可选的值为”zhxw”, “tpxw”, “rcpy”, “jxky”, “whhd”, “xyrw”, “jlhz”, “shfw”, “mtgz”page
:必需参数,当前页数,从0开始,0表示第一页
示例:获取第5页的综合新闻:(此处参数值为:category=zhxw,page=4):http://api.iflab.org/api/v2/newsapi/newslist?category=zhxw&page=5
示例请求成功返回值:
1 | [ |
从数据源中我们可以看出,新闻模块数据源跟目前市面上的新闻资讯类App展示出的数据种类大致相同,有newsTitle
、newsTime
、newsImage
、newsIntro
等,所以此处给了我们一个暗示可以参考目前市面上已有的资讯类App的设计。
获取新闻详情
接口:http://api.iflab.org/api/v2/newsapi/newsdetail
请求方法:get
参数:link
:必需参数,新闻列表接口中返回的newsLink内容
示例请求成功返回值:
1 | { |
新闻详情不是必须的,但是学校官网并没有做移动端适配,导致直接设置webView的requestURL出来的是的full size规格的页面。
新闻详情的数据源太长了,大家有兴趣的话可以参考iBistu的后端文档看看,其中有趣的是你会发现返回的新闻详情数据源实体并未是H5标签,而是字!符!串!,那么新闻中的图片去哪了?对!就是imgList
字段,如果你真的去看了后端文档新闻详情部分的接口,你会发现那一大段的新闻详情实体介绍居然中间有回车换行符!!!这部分我是用的chrome的JSONVIEW格式化的JSON数据后发现的有几个可爱的“回车符”!
再仔细对比原新闻和3.3版本iBistu,emmm这几个换行符的位置就是要插入图片的位置,关于搞定iBistu新闻详情模块的细节可以参考之前为iBistu新闻做的微信小程序开发总结,以下为节选,
······我的乖乖,您看懂是什么意思了么?一堆回车符的地方就是要插入图片的地方。😱。所以我们要根据回车符出现的地方来判断是否应该插入图片,看了看iBistu的新闻详情部分的实现,确实是这么做的。
但是更伤的问题来了,根据回车符我截断字符串在数组里,然后po出了内容,一看更呆了,图片在一个地方集中出现得越多,那么这块地方的换行符也就越多,换句话说,得根据回车符的多少来决定插入的图片数量。
嗯,其实这还不是最伤的,按照这个思路弄完了以后,浏览了前面几条新闻,完美对上了,但是!!!到了后边的几条新闻就全乱了。该出现图片的地方没出现,不该出现的图片的地方空一大片
原因是因为刚开始找到的规则是,三个换行放一张图片,如果当前区域放超过一张图片,比如说是两张图片,换行数则由三个变成了七个,也就是说,以三位基数,每多加两个换行多一张图片。
但事实上不是这样啊!😭。后边几条新闻的换行数跟图片数对应关系完全不符合之前找到的,全乱了。这就非常的难受了。弄到最后,实在没办法,决定了如果是多张图片就只放一张😔。
如果这部分你没能拿到真实数据好好研究一番的话,就算看了代码意义也不太大······
iBistu 4.0延用了之前3.3的实现,同样也是判断\n
的出现,具体实现细节我们编码部分细说。
设计
仔细看喔,新闻详情居然是个tableView!!!我也不知道为啥之前设计的时候要用到tableView(这部分代码不是我写的,逃)
编码
关于新闻分类的segementView,本着“多快好省”的理念🙂。直接用了HMSegmentedControl,使用起来非常简单,但是现在iBistu我要慢慢转变思维,以往都是直接看上哪个第三方库好用就二话不说直接拿来就开造,虽然能够让接手开发的同学快速出成果,但是iBistu毕竟是要体现出社团实际开发水平的一个东西,因此我有一个粗浅的想法,把iBistu用到的一些第三方库如果能够我们自己实现就自己实现。
我们要不是说要取代这些用到的第三方库,而是要丢弃一些第三方库中所多余的东西,很多东西不是说它不好,而是说不合适,再加上现在社团的同学一届比一届强,我们有足够的实力造一些开源组件🙂。
新闻列表,我们经历了几次变化,3.3中是沿袭了以往的设计,4.0刚开始进入开发阶段时我们采取的是简书的设计,做完了以后我发现图模糊而且设计上还是有些尴尬,比如字重的比例、文字的位置等
在4.0快要结束的时候终于下定决心,抛弃copy for 简书的风格,改为copy for 知乎,是老版本的知乎(现在新版知乎也改了,改为了“字左图右”的样式,让用户更加专注于每个问题的文字内容而不是图片),从下图中可以看到,应该能够让大家更加喜欢喜欢看iBistu新闻吧!🙂
新闻详情部分,使用到的是DTCoreText来渲染HTML,因为这部分内容是3.3遗留下来的,然而事实上HTML能够直接用webView进行渲染的,并不知道这是为啥😓。po一段success块代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15ICNewsDetail *news = [[ICNewsDetail alloc] init];
news.title = dic[@"title"];
news.creationTime = dic[@"time"]; news.pcURL = dic[@"imgList"]; news.body = [NSString stringWithFormat:@"<body><p>%@</p></body>", dic[@"article"]];
news.body = [news.body stringByReplacingOccurrencesOfString:@"\n" withString:@"</p><p>"];
news.body = [news.body stringByReplacingOccurrencesOfString:@"<p> </p>" withString:@"<p></p>"];
for (int i=0; i<news.pcURL.count; i++) {
@try {
news.body = [news.body stringByReplacingCharactersInRange:[news.body rangeOfString:@"<p></p><p></p>"] withString:[NSString stringWithFormat:@"<img src=\"%@\">", news.pcURL[i]]];
} @catch (NSException *exception) {
if ([exception.name isEqualToString:NSRangeException]) {
break;
}
}
}
success(news);可以看到是判断
新闻详情样式在4.1中会得到修改。\n
字符的出现来做<p></p>
标签替换,然后再根据<p></p>
的出现位置,插入<img>
标签。新闻的分享功能采取的做法与失物模块的分享做法一直,新闻详情的数据源主体是tableView,tableView继承于scrollView,所以接下来的组佛就跟失物模块中的分享功能一样啦,有兴趣的同学可以自行转移阵地。
总结
新闻模块为iBistu 4.0中技术难度相对较高的一部分,适合新手切入iBistu开发中的拔高模块。涉及到的难度主要是位于新闻详情(虽然这部分工作之前已经做好了。🙂)
新闻模块的改动迭代次数较多而且每次迭代都是大改,虽然从整体上看难度不大,但很多地方都是团队开发同学一路来慢慢摸索,有时候费老大劲才做出来的效果,很多时候其它同学有了更好的思路就立马直接开始重新改了,现在总体看起来效果还算不错,但还算有改进的空间。