之前因为工作需要要实现一个类似的
悬浮+视差的headerView的效果,
研究了好久没研究出来怎么做,最后用UICollectionView + CSStickyHeaderFlowLayout的方法实现了(不得不说CSStickyHeaderFlowLayout真的是一个很强大的库,作者对UICollectionView的理解真的是深刻,建议有空一定要看一下他的源码)。唯一有点小不爽的是我用了一个UICollectionView来实现了一个UITableView。。。
 
后来在gitHub上受ARSegmentPager启发,发现了另外一种巧妙的思路,也可以比较好的实现这种效果,而且用UITableView就可以实现,实现方式也比较简单,还可以做更多的扩展,所以赶紧记录一下。
 
这个思路的核心就是:
     将自定义的headerView放在tabView 的上面,而不是作为tableView.tableHeaderView(即headerView和tableView平级,都添加到viewController的view上),然后设置tableView的contentInset为合适的值,在tableView滑动的时候,动态改变view的位置或者大小,使这个headerView看起来就像是有了悬浮功能的tableView.tableHeaderView。
 
我原来老想着利用在tableView的内部做点什么来实现这个功能,而这个方法让我跳出了定式思维,把headerView放在外面,可就想怎么变就怎么变了!!!(而且如果不提前说,几乎看不出来这不是tableHeaderView)
比如说这样:
或者这样:
再或者这样:
 
当然,还可以做更多炫酷的效果,我这儿只是几个最简单最容易实现的。
具体demo地址在这里:https://github.com/Phelthas/TEST_XMLCommon
 
玩过以后你可能也发现问题了,这个只有手指在tableView上的时候才能滑动,在headerView上就不行了。。。。。。这肯定不能忍了,

所以需要想个办法可以让tableView的手势可以透过这个自定义的headerView,而这个方法,就是重载headerView的hitTest方法。(代码我已经更新到gitHub上了)
 
hitTest具体机制及原理可以google百度,大概的作用就是控制UIEvent的传递,返回应该由哪个view来响应事件。
因为这个事件的传递是由顶层向下传递的,所以add到headerView之上的view会优先响应其自己的事件,所以headerView上的button之类的subView都不会受到影响(但是add到headerView上的手势就不行了,如果有需要,可以在headerView上add一个等大小的subView,把手势加到这个subView上)。
所以这个方法hitTest方法在这里还是很好用的~~~ 

一个巧妙的实现悬浮的tableViewHeader的方法的更多相关文章

  1. php处理数据库数据,每处理一个数据返回客户端显示当前状态的方法。

    php处理大量数据,每处理一个数据返回客户端显示当前状态的方法. 类似于dedecms生成静态页 想法: 客户端发送请求 服务器端接受请求,开始统计所需处理的数据量 将所需处理数据按一定规则排列,发送 ...

  2. Java判断一个字符是否是数字的几种方法的代码

    在工作期间,将写内容过程经常用到的一些内容段做个记录,下面内容是关于Java判断一个字符是否是数字的几种方法的内容,希望能对码农们有好处. public class Test{ public stat ...

  3. 一个简单的修改 iis默认页面的方法..

    1. IIS 默认打开的是欢迎页面 2. 然后找到了一个比较简单的修改默认界面的方法: 找到这个文件的默认路径 C:\inetpub\wwwroot 然后修改 iisstart.htm 文件 在hea ...

  4. 每天一个JavaScript实例-apply和call的使用方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. slice(start, [end]) 选取一个匹配的子集 与原来的slice方法类似

    slice(start, [end]) 概述 选取一个匹配的子集 与原来的slice方法类似 参数 startIntegerV1.1.4 开始选取子集的位置.第一个元素是0.如果是负数,则可以从集合的 ...

  6. 定义一个接口CanFly,描述会飞的方法public void fly();

    1.使用类与接口的知识完成如下要求:(1)定义一个接口CanFly,描述会飞的方法public void fly();(2)分别定义类飞机和鸟,实现CanFly接口.(3)定义一个测试类,测试飞机和鸟 ...

  7. 实现一个EventEmitter类,这个类包含以下方法: on/ once/fire/off

    实现一个EventEmitter类,这个类包含以下方法: on(监听事件,该事件可以被触发多次)- once(也是监听事件,但只能被触发一次)- fire(触发指定的事件)- off(移除指定事件的某 ...

  8. 一个提高GPU模糊算法的速度的方法

    一个提高GPU模糊算法的速度的方法 我们知道,模糊算法,比如高斯模糊是卷积算法的一种应用.计算图像中一个像素的模糊颜色值需要通过采样周围像素的颜色值来计算. 对于GPU应用,比如OpenGL,在sha ...

  9. 排查dubbo接口重复注销问题,我发现了一个巧妙的设计

    背景 我在公司内负责自研的dubbo注册中心相关工作,群里经常接到业务方反馈dubbo接口注销报错.经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会 ...

随机推荐

  1. [java] 汇率换算器实现-插曲1-正则表达式(1)

    [java] 汇率换算器实现-插曲1-正则表达式(1) // */ // ]]> // */ // ]]>   [java] 汇率换算器实现-插曲1-正则表达式(1) Table of C ...

  2. HTML语义化:HTML5新标签——template

    一.前言 当我们使用String-base的模板引擎(如Handlebars.js等)时,要么就通过外部文件存放模板文本,需要时再通过XHR或script标签加载进来:要么通过<script t ...

  3. CP/IP,SPDY,WebSocket 三者之间的关系

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议.在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议.一.HTTP的 ...

  4. 【Swift学习】Swift编程之旅---方法(十五)

    在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...

  5. spring 数据校验之Hibernate validation

    1.需要的jar包 2.springsevlet-config.xml配置 在spring3之后,任何支持JSR303的validator(如Hibernate Validator)都可以通过简单配置 ...

  6. linux两个文件修改主机名

    linux修改主机名的方法 用hostname命令可以临时修改机器名,但机器重新启动之后就会恢复原来的值. #hostname   //查看机器名#hostname -i  //查看本机器名对应的ip ...

  7. C# 之httpwatch 缩减HttpWatch成可以进行二次开发的代码

    写在前面 本文由来 特别鸣谢 支持开源 1. 写在前面 也是由于项目需要,之前对抓包,有两个方向的理解 1.使用代理抓包,自己写一个中转服务器,就可用拿到,发送和服务器返回的任何数据了.(因为操作的时 ...

  8. 修正 XE6 TListView 上方 SearchBok 右边的清除钮显示

    注意:XE7 已修正这个问题. Delphi Firemonkey TListView 提供了搜寻的功能,但在 XE6 以前的版本,可以显示右边的清除按钮,在 XE6 确消失了,这里提供一个修正的方案 ...

  9. 【Linux_Fedora_应用系列】_4_安装chrome浏览器

    在前面一篇文章中,我们讨论了在Linux Fedora 14下安装WMV解码器:[Linux_Fedora_应用系列]_3_如何利用Smplayer播放WMV格式的文件 在文章中介绍的方法同样适合FC ...

  10. Verilog学习笔记简单功能实现(八)...............同步FIFO

    Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...