首先声明一点,由于自己iOS开发经验有限,这里给下面将要实现的效果起名叫视差滚动视图,自己也不知道是否严谨,等以后有经验了,再来更新吧。

一、需求

  有的时候我们可能会有这样一种需求,在一个UITableView的上方放置一个View(为了下面实现方便,这里就叫TopView吧),想要实现的效果是,当滚动UITableView时,让TopView也一起向上滚动;当TopView滚动到一定位置时,不再继续滚动TopView,而只是滚动UITableView。

二、思路

  1、开始时的思路是这样的,因为TopView是需要滚动的,所以将TopView和UITableView添加到一个UIScrollView中,根据UIScrollView的contentOffset.y判断是否需要继续滚动,也即默认禁用UITableView的scrollEnabled属性,当UIScrollView的contentOffset.y达到一定值以后,禁用UIScrollView的scrollEnabled属性,启用UITableView的scrollEnabled属性。但是经过试验发现,这种做法总是会出现各种各样的问题,问题这里就不一一列举了,总之在一番折腾之后,最终抛弃了这种思路。

  2、既然把它俩添加到一个父控件UIScrollView中是不可行的,那就只能从UITableView本身去分析了。如果想要UITableView滚动的同时,cell一直处于UITableView的视图上而没有被卸载存入缓存池中,那是否可以通过设置UITableView的contentInset属性来实现呢?也就是像这样:

  这样的话,如果再在cell的上方放置一个TopView,在cell滚动的同时改变TopView的y值使之同步上移,也就造成了一种假象:UITableView和TopView一起向上滚动,但是实际上只是cell和TopView一起滚动。也就是像这样:

三、实现

  所以最终可以理解为这样:

  那么在UITableView滚动的同时,TopView需要上移多少呢?也即怎么保证他们是同步的呢?那就需要计算cell上移了多少,cell上移多少,TopView也就跟着上移多少,这样不就可以严格同步了么?用UITableView最初的偏移量减去当前的偏移量,就得到了cell上移了多少。也就是像这样:

  当UITableView的偏移量为0时,也即意味着TopView不再需要上移了,如果此时再继续滚动的话,cell就会因为超出UITableView的视图边界而被卸载存入到缓存池中,这就会造成一种假象:TopView不再滚动了,但是UITableView还在滚动。

  所以最终的效果就是这样的:

ps:可能这样的效果实现起来在各位看来并不是什么问题,但是真的是由于自己经验有限,所以还是将折腾的过程记录下来,作为一个归纳总结吧,不喜勿喷。

iOS开发之视差滚动视图的更多相关文章

  1. iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇

    前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...

  2. 使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台

    www.gbtags.com 使用javascript开发的视差滚动效果的云彩 阅读全文:使用javascript开发的视差滚动效果的云彩 极客标签 - 做最棒的极客知识分享平台

  3. 使用javascript开发的视差滚动效果的云彩

    在线演示 jquery.parallax.js是一款能够帮助你快速开发视差效果的jQuery插件,在这里我们使用它来开发一款漂亮的云朵视差效果. 主要代码: Javascript ........ 阅 ...

  4. iOS开发——代码生成TabBar与视图切换具体解释

    我在之前多篇博客中解说了在不使用storyboard而使用nib文件的情况下.使用代码生成导航栏并进行跳转,具体能够參考<iOS开发--界面跳转与返回及视图类型具体解释><iOS纯代 ...

  5. [转]IOS 学习笔记(8) 滚动视图(UIScrollView)的使用方法

    下面介绍pageControl结合ScrollView实现连续滑动翻页的效果,ScrollView我们在应用开发中经常用到,以g这种翻页效果还是很好看的,如下图所示: 通过这个例子,我们重点学习UIS ...

  6. iOS开发之窗口和视图

    视图就是应用程序的界面.视图可以使用nib文件实现,也可以使用代码创建.一个视图也是一个响应器(UIResponder的子类)这意味着一个视图可以与用户交互.因此,视图不只是用户可看到的界面,也是可以 ...

  7. Android 开发笔记___滚动视图__scroll view

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. iOS开发如何在一个透明视图上添加不透明的子控件

    相信很多同学都会遇到过这个问题, 当我们弹出一个半透明的遮盖层时, 又想在遮盖层上加一些子视图, 这个时候如果你的遮盖层设置了alpha属性,  你会惊讶的发现, 加载遮盖层上的所有子控件都是透明了, ...

  9. iOS开发 差间距滚动

    CGFloat fView_Height(UIView *aView) { return aView.frame.size.height; } CGFloat fView_Width(UIView * ...

随机推荐

  1. linux 下把Caps_Lock 映射成Ctrl

    我用的是debian 7,以前是gnome桌面,系统里就有改变键盘布局的设置.之前gnome 崩了一次,就换成了openbox ,稍微配置了一下也可以很好使用. 可以参考这篇文章 5分钟openbox ...

  2. android中使用Http下载文件并保存到本地SD卡

    1.AndroidMainfest.xml中设置权限 <uses-permission android:name="android.permission.INTERNET"& ...

  3. .Net程序员学用Oracle系列(2):准备测试环境

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.创建说明 1.1.为什么要创建的测试环境? 1.2.了解 Oracle 实例的默认用户 2.创建环境 2.1.创建基本环境 ...

  4. python3.4 data type

    #coding=utf-8 #Python 3.4 https://docs.python.org/3.4/library/ #IDE:Eclipse +PyDev Window10 import a ...

  5. Mocha的单元测试实战

    Mocha Mocha是一个测试框架,为JS应用添加测试.使用见:mochajs. Mocha结合Nodejs实战 ontstair.js 这里我们使用自定义模块:ontstair.js,代码如下. ...

  6. CodeForces 384C Milking cows

    水题. 对于两个$0$,肯定是先删去后面的$0$,再删去前面的$0$. 对于两个$1$,肯定是先删去前面的$1$,再删去后面的$1$. 对于一个$0$和一个$1$,无论先删哪一个,对答案做出的贡献都是 ...

  7. 将bat文件或exe程序注册成windows服务

    命令行使用sc命令.关于sc命令的详解,请自行查看帮助(sc /?),在此只简单提及如何加入系统服务功能.加入服务:sc create ServiceName binPath= 路径 start= a ...

  8. 【游记】NOIP2015造纸记

    题目来自HZWER学长的名言:“虽然已经做好了学OI就是打铁的准备.” 然后我发现我已经不是打铁,只能造纸了啊_(:3LZ_) [DAY0] 中午吃了饭才1:00,说好2:30才出发于是各种闲逛.2: ...

  9. Intellij 快捷键

    11ctrl+F12  类似于eclipse 的outline  显示出当前类的所有方法. ctrl+H 查看当前类或者方法的集成结构 ctrl+E 查看最近使用的文件 Ctrl+J 自动完成提示 C ...

  10. Mysql 常用命令和注意事项

    1. 连接mysql数据库 如果配置了环境变量可以直接运行,如果没有配置环境变量需要在安装目录...\bin下运行, cmd -> mysql -u root -p,然后输入密码: 或者可以运行 ...