美文网首页UI效果ios 进阶iOS
iOS 实现时间线列表效果

iOS 实现时间线列表效果

作者: Cyandev | 来源:发表于2016-05-14 19:55 被阅读8838次

之前看到美团的订单详情页面很有特色,于是决定模仿一下这个效果。


其实就是简单的 TableView 技巧,下面我们就来一步一步实现它。

画个泡泡

首先到 Sketch 里画出气泡的效果


很简单,一个圆角矩形 + 一个三角形,然后 Union 操作一下,勾个边,done!

然后导出图片文件,添加到 Xcode 中。

设计 TableViewCell 原型

子类化一个新的 UITableViewCell + Xib,简单拖拽几个控件。


我这里那两条线就没用 AutoLayout 了,太小了,回来直接用代码布局就行了。

拖线连几个 Outlet ,然后把气泡背景设置一下:


事实上,气泡的背景图我制作了两个版本,一个是未选中的状态,另外一个是选中的状态,背景颜色不一样,所以我在 setHighlighted(:_, :_) 这个函数中进行设置,其他的保持默认即可。

然后在 ViewController 中随便做一些假数据,先看看效果。

哈哈,已经初具雏形了。但是还有一点问题:

  • 底部的线是断掉的,并且颜色不对
  • 下拉时上边的线也会断掉
    那么下面我们就来修复这些问题。

完善细节效果

这里我的思路是在 ViewController 中再添加两个 View,并且监听 TableView 的滚动,然后动态调节两个 View 的位置。

首先声明两个新 View:


然后修正线条的颜色:


我在 tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 中获取到 Cell 中线条的颜色,这样我们随时修改 Cell 中的颜色,这里就会自动变换,而不用 Hardcode

然后是比较困难的线条位置调整,我们需要得到 Cell 中线条的位置,让其 x 坐标和宽度一致,y 坐标和高度动态调整。

首先解决 x 坐标和宽度:



还是在 willDisplay 的方法中,我们用到了 convertPoint 方法进行坐标系变换,就是将线条在 Cell 中的坐标映射到它应该在 SuperView 中的坐标。

然后解决 y 坐标和高度:



因为要动态调整,所以我们监听滚动事件,并在其中计算各个坐标。有关这个公式的推导大家可以看看下拉刷新里公式的推导,它们是一致的。

到这里我们就基本完成这个效果了,看看怎么样吧:


小提醒

不要在 UITableViewController 中添加自己的 Subview ,因为它的 view 属性就是 TableView,如果添加 Subview,它们会一起滚动,虽然 WWDC 中也介绍过怎么处理,但毕竟太麻烦,所以我还是推荐大家直接用 UIViewController + TableView 来处理这类比较复杂的效果。

Have fun!!

相关文章

网友评论

  • 5e0e76059864:求demo
  • 91e0a754d798:我是原来的abeihaha,现在换了账号,已经将Demo上传至github上,小伙伴们可以参考一下,记得star哦,谢谢。
    https://github.com/cocoadogs/MeiTuan.git
  • 3567df4392b2:根据你的这些思路,再结合tdt的自动布局改变约束的思路,我已经做出Demo了,将发到GitHub上:smiley:
  • Eugene_iOS:很喜欢美团订单时间线这个设计,依照博主文章的逻辑,写了OC版:https://github.com/ZyjEugene/TQTimeLine.git
  • Yokihr:有代码可以分享么
  • ilovemdcat99:不错的思路,Mark
  • tdt:模拟器上看是对准了,真机上有大概0.5的差距。。。但是打印的x坐标数值上是一致的(均为32),手动微调0.5无效。。。

    然后想,是不是把第一个cell的topLine长度弄长点就行了(比如1000)。

    转念一想,这样貌似可以。

    ```
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) as? XXXXXXXXCell
    cell?.topLineTopConstraint.constant = min(0, scrollView.contentOffset.y)
    }
    ```

    只有当下拉的时候,topconstraint才小于0,动态加长。
    3567df4392b2:之前这个0.5的差一直存在,现在通过改变约束,完全不需要再添加topLine和bottomLine在view上
  • WheatDen:谢谢,已经根据你的文章,实现了Object-C的demo,项目也是正在需要。
    Cyandev:@青卷三部 谢谢分享
    WheatDen:@青卷三部 demo我已经发布到git 、 code4app 和 cocoapods 上。并且在code4app和cocoapods均已说明,demo源泉来自你的文章,也附有文章链接。。再次谢谢。
    iOS之TimeLine(时间轴)的实现
    http://code4app.com/forum.php?mod=viewthread&tid=9914&fromuid=825328
    https://github.com/Wheat-Qin/TimeLine

    再次谢谢你
  • 071a958d5815:终于找到了
  • 自由在心: Sketch ?工具全名叫什么,appStore搜索到很多。
    Cyandev:@自由在心 一个钻石的图标,全称就是 Sketch
  • ac2c5e86bd8c:刚用上:heart_eyes::heart_eyes:
  • Sunnyyangzx:分享个demo呗 :smile:
  • 心中的信念:写个oc版本的
  • 26381a39b4cc:思想是好的,但是topLine和bottomLine没必要搞得这么麻烦,直接设置header和footer就好了~~
  • 我就叫土豆:上传到github了吗?
    Cyandev:@我就叫土豆 没有
  • 张漂亮的故事:有空试试
  • 8c1235e0a388:学习了
  • 桃花流水鳜鱼肥:哇,学习学习
  • 齐刘海姑娘:哈喽~您的文章已收录专题“ 我不是程序猿,请叫我攻城狮”http://www.jianshu.com/collection/db91065b98c6,欢迎关注投稿哦~ :kissing_heart: :heart:
  • _YZG_:求个demo
  • 像羽毛那样轻: 本来想大赏的,但是看到自己都没有iPad Pro 果断拒绝了!
    Cyandev:@像羽毛那样轻 ...
  • 我系哆啦:打赏够直白,然而我是不会给你打赏的 :smile:
  • vernepung:假如...我在self.view上加一个竖线,height是页面高度..会怎么样呢?
    Cyandev:@vernepung 其实也是可以的
    vernepung:@Cyandev 一个背景色的问题
    Cyandev:@vernepung 小点之间的缝隙会露出来
  • a3c619581c4f:有demo链接吗?
    Cyandev:@Prospero 还没有
  • cbb32a673931:好受用
  • 4ed6afef78f9:这个求打赏,够直白.
    Cyandev:@AndersWang Cell最好用Xib设计,storyboard一般是设计界面流程的
    57c4e0896953:@Cyandev 楼主有源代码例子可供下载参考吗?iOS新手入门的时候就是swift的开始所以对xib也不了解,学iOS的时候就是storyboard了,不是很明白你一开始指的那两条线怎么弄出来的,好像也不是图片吧,就是那个top line和bottom line. 另外你这个方面我直接在storyboard里怎么做不用你这个xib的方式?
    Cyandev:@网络菜鸟 任何不说明目的的求打赏都是耍流氓。

本文标题:iOS 实现时间线列表效果

本文链接:https://www.haomeiwen.com/subject/kltvrttx.html