博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[iOS]仿 Airbnb 的 tableView 头部视图层叠效果
阅读量:7013 次
发布时间:2019-06-28

本文共 2578 字,大约阅读时间需要 8 分钟。

用过 Airbnb 的都知道首页有一个 tableView 头部视图层叠效果, 就像这样的 :

实现起来很简单, 这里就来看一下怎么实现这个效果.

实现思路

  • 先搭建一个tableView基础, 新建一个工程,把原有的 Storyboard 中的 UIViewController 删除,拉一个 UITableViewController 进来,并把 is Initial View Controller 勾上, 把 ViewController 的父类改成 UITableViewController, 最后把在 Storyboard 中把 UITableViewControllerClass 改成 ViewController, command + R 运行.
  • 接下来继承 UIView 创建一个带Xib的自己的HeaderView,在HeaderView中使用autolayout布局一个UIImageView` 容器视图,拉入美女图片,显示.
  • 回到 ViewController 中,把刚才创建的 HeaderView 作为一个子视图插入到 tableView 下方.设置 tableView 上部额外的滚动区域,用来显示头部视图.
  • scrollViewDidScroll 方法中设置一个层叠的覆盖速率,保存想要的 frame,
  • viewWillLayoutSubviews 方法中更新头部视图的 frame, command + R, 搞定.

核心思路

在我们滚动的时候,计算好头部视图垂直方向上的变化,保存到 frame 中,在 viewWillLayoutSubviews 不断更新头部视图的 frame.

具体代码分析

  • @interface 新建两个属性:
@interface ViewController ()/** header */@property(nonatomic, strong)HeaderView *header;/** headerFrame */@property(nonatomic, assign)CGRect headerFrame;@end复制代码
  • 约定两个常量的值
// 头部视图高度const CGFloat headerHeight = 400;// 层叠的覆盖速率const CGFloat speed = 0.6; // speed <= 1  复制代码
  • viewDidLoad 方法里,设置头部视图的插入层级关系, 给 tableView 顶部插入额外的滚动区域,用来显示头部视图, 应用启动, 滚动到最顶部,显示额外的头部视图.
- (void)viewDidLoad {    [super viewDidLoad];        HeaderView *header = [HeaderView viewFromXib];    // 一定要将header插入到tableView的下面,才有层叠覆盖的效果    [self.view insertSubview:header atIndex:0];    self.header = header;        // 给tableView顶部插入额外的滚动区域,用来显示头部视图    self.tableView.contentInset = UIEdgeInsetsMake(headerHeight, 0, 0, 0);    // 应用启动, 滚动到最顶部,显示额外的头部视图    [self.tableView setContentOffset:CGPointMake(0, -headerHeight)];        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:reuseID];}复制代码
  • scrollViewDidScroll 方法里就是实现效果的核心代码, 计算 headerView 以我们滚动时的速度的 speed 倍速度滚动时对应的 frame 值,并保存起来.
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{    // 由于上面设置了应用额外的滚动区域,所以应用一启动就会来到这个方法    // scrollView.contentOffset.y的值是添加的额外滚动的值headerHeight, 此时headerHeight * speed - headerHeight * (1 - speed) = headerHeight, 从而一启动的时候, 头部视图是按照我们想要的位置布局的    // 以后当tableView滚动的时候, 头部视图就以我们滚动时的速度的speed倍滚动 , 把这个值保存到self.headerFrame, 在viewWillLayoutSubviews中更新头部视图的frame    CGRect org = CGRectMake(0, -headerHeight, self.view.frame.size.width, headerHeight);    org.origin.y = scrollView.contentOffset.y * speed - headerHeight * (1 - speed);    self.headerFrame = org;}复制代码
  • viewWillLayoutSubviews 中不断更新头部视图的 frame.
-(void)viewWillLayoutSubviews{    [super viewWillLayoutSubviews];    // 每次布局子控件的时候,都要更新头部视图的frame    self.header.frame = self.headerFrame;}复制代码

NewPan 的文章集合

下面这个链接是我所有文章的一个集合目录。这些文章凡是涉及实现的,每篇文章中都有 地址, 上都有源码。

如果你有问题,除了在文章最后留言,还可以在微博 上给我留言,以及访问我的 。

转载地址:http://voqtl.baihongyu.com/

你可能感兴趣的文章
我在大学毕业后学习Linux、python的一些经验
查看>>
探索虚函数表
查看>>
记一次对象归档中的错误, initWithCoder报
查看>>
MacOS安装delve
查看>>
VIM简单上手
查看>>
多张图片上传简单示例
查看>>
FADE代码解析2
查看>>
线程使用三——future和callable详解
查看>>
Logstash + DataHub + MaxCompute/StreamCompute 进行实时数据分析
查看>>
阿里云数加大数据计算服务MaxCompute学习路线图 (持续更新中)
查看>>
聊聊springcloud的GatewayControllerEndpoint
查看>>
聊聊sentinel的SentinelResourceAspect
查看>>
聊聊flink的SpoutWrapper
查看>>
聊聊flink的StateDescriptor
查看>>
git 使用教程,常用命令
查看>>
Android view事件分发初步
查看>>
使用SVI实现Vlan间路由
查看>>
Linux学习笔记5月28日任务
查看>>
解决Td内容为空时不显示边框的问题-兼容IE、firefox、chrome
查看>>
SylixOS x86中断探测(二)
查看>>