V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lisi1987
V2EX  ›  iOS

iOS 高仿支付宝 9.x 版本首页

  •  
  •   lisi1987 · 2016-10-11 16:37:35 +08:00 · 6612 次点击
    这是一个创建于 2965 天前的主题,其中的信息可能已经有所发展或是发生改变。

    支付宝 9.x 版本首页效果

    对于新版支付宝首页的产品功能这里就不说什么了,一大堆人吐槽,我们只想要一个好好的支付工具,阿里硬是要融入社交...

    今天这里不是来评论支付宝功能的,而是作为一个 iOS 开发人员在使用的过程中发现,首页这滑动好“怪异”啊~~

    首先,右侧的滚动条的位置好怪!为什么在中间?只能说明一个问题,这个 tableview 是从这里开始的。

    其次,既然 tableview 在中间开始,那上面那一片 view 是如何滚动的(从滚动条可以看出不是 tableviewheader )?而且和 tableview 做到无缝衔接。

    再次,滑动 tableview 上面那块 view ,直接响应滑动。

    通过上面种种奇怪的现象,于是我决定针对这个效果些一个 demo 来玩玩。

    (最后闪的那几下请忽略, gif 图片没有做完美,并不是 demo 的 bug 。。。。)

    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 {
                //处理功能区隐藏和视差
                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 让其继续滚动。

    9 条回复    2016-10-12 17:42:31 +08:00
    SeanChense
        1
    SeanChense  
       2016-10-11 16:41:27 +08:00
    scrollview + tableview 肯定不是通过这种方式来避免滑动冲突。
    lisi1987
        2
    lisi1987  
    OP
       2016-10-11 16:45:04 +08:00
    @SeanChense 关键是看要实现什么样的效果了,如果仅仅只是避免滑动冲突有很多种,比如重写 hitTest 。

    要完美复现支付宝这个效果我发现这是最好的方法了。。。

    或者你有什么思路可以提出来探讨下?
    loveuqian
        3
    loveuqian  
       2016-10-11 19:37:48 +08:00 via iPhone
    为何不直接看看他的界面结构啊
    lisi1987
        4
    lisi1987  
    OP
       2016-10-11 20:25:43 +08:00
    @loveuqian iOS 下如何看啊?
    loveuqian
        5
    loveuqian  
       2016-10-12 10:20:23 +08:00
    lisi1987
        6
    lisi1987  
    OP
       2016-10-12 10:23:26 +08:00
    @loveuqian 这玩意得越狱吧。。。不越狱好多年了
    Creolophus
        7
    Creolophus  
       2016-10-12 15:48:13 +08:00
    我更好奇系统自带的天气里面的结构...感觉和这个类似,但效果更复杂
    Creolophus
        8
    Creolophus  
       2016-10-12 16:10:43 +08:00
    有个问题,如果 tableview 里的 Cell 是动态高度的呢,也就是说 tableview 的 contentsize 是动态的呢
    lisi1987
        9
    lisi1987  
    OP
       2016-10-12 17:42:31 +08:00
    @Creolophus 动态的 contentsize 没有关系,内容也跟着动态变就可以了,我更新了一版代码,去 pull 一下可以看看,我增加了动态添加 cell (下拉刷新添加 cell )

    系统自带天气的结构其实不复杂啊比这个简单,一个普通的 tableview 可以实现,初始状态设置一个 contentInset 而已,顶部的城市和温度根据 tableview 的 offset 变化而变化,横向滑动的只需一个 section 就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:30 · PVG 23:30 · LAX 07:30 · JFK 10:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.