支付宝 9.x 版本首页效果
对于新版支付宝首页的产品功能这里就不说什么了,一大堆人吐槽,我们只想要一个好好的支付工具,阿里硬是要融入社交...
今天这里不是来评论支付宝功能的,而是作为一个iOS开发人员在使用的过程中发现,首页这滑动好“怪异”啊~~

首先,右侧的滚动条的位置好怪!为什么在中间?只能说明一个问题,这个tableview是从这里开始的。
其次,既然tableview在中间开始,那上面那一片view是如何滚动的(从滚动条可以看出不是tableviewheader)?而且和tableview做到无缝衔接。
再次,滑动tableview上面那块view,直接响应滑动。
通过上面种种奇怪的现象,于是我决定针对这个效果些一个demo来玩玩。

demo地址: https://github.com/seedotlee/AlipayIndexDemo
因为是demo嘛,所以代码就尽量简单,处理就基本只放在一个class中,这样比较容易理解,大家就不要吐槽这一块了~~~
关键点
经过我反复实验,还是 UIScrollView + UITableView 的方式实现最靠谱,那问题来了,如何处理两个ScrollView的滑动冲突?
答案就是关掉一个滑动!当然就是关掉tableview的滑动,通过外层scrollview的offset来直接控制tableview的滑动,关键代码:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let y = scrollView.contentOffset.y
if y <= 0 {
var newFrame = self.headerView.frame
newFrame.origin.y = y
self.headerView.frame = newFrame
newFrame = self.mainTableView.frame
newFrame.origin.y = y + topOffsetY
self.mainTableView.frame = newFrame
//偏移量给到tableview,tableview自己来滑动
self.mainTableView.setScrollViewContentOffSet(point: CGPoint(x: 0, y: y))
//功能区状态回归
newFrame = self.functionHeaderView.frame
newFrame.origin.y = 0
self.functionHeaderView.frame = newFrame
} else if y < functionHeaderViewHeight && y > 0{
//处理功能区隐藏和视差
var newFrame = self.functionHeaderView.frame
newFrame.origin.y = y/2
self.functionHeaderView.frame = newFrame
//处理透明度
let alpha = (1 - y/functionHeaderViewHeight*2.5 ) > 0 ? (1 - y/functionHeaderViewHeight*2.5 ) : 0
functionHeaderView.alpha = alpha
if alpha > 0.5 {
let newAlpha = alpha*2 - 1
mainNavView.alpha = newAlpha
coverNavView.alpha = 0
} else {
let newAlpha = alpha*2
mainNavView.alpha = 0
coverNavView.alpha = 1 - newAlpha
}
}
}
这里的关键就是当想上滑动的时候,实际就是滑动最外层的scrollview,然而想下滑动到顶的时候仅仅只讲offset传递给tableview让其继续滚动。
tableview嵌入方式借鉴了:
网友评论
coverNavView.alpha = 0 可以解决快速下拉导致的导航栏bug
支付宝的效果:手指按中“扫一扫”or“付款”,此时这些按钮是有高亮的,如果此时没有松开的手指顺势向下移动,按钮的高亮会取消,并且tableview还能同时向下滚动。
目前demo效果:手指向下移动的时候,高亮取消,不过tableview不能继续滚动了。
哈哈,比较纠结这些小效果。
向下拖拽tableView一定距离,可以执行刷新动作时,tableView会突然复位到原来位置,再进行下拉刷新动作;
没有搞清楚为什么😳
https://github.com/guoyutao/AliPayDemo
@Cooperluffy丨路飞 @苍鹰_5eea
求解