美文网首页小小文自己尝试等装一下各个专家
iOS - 仿支付宝(9.9.2)首页页面滚动

iOS - 仿支付宝(9.9.2)首页页面滚动

作者: 程序员咿呀咿呀哟 | 来源:发表于2016-09-21 18:49 被阅读7136次

    公司的app做交互的同学竟然做了一个和支付宝首页类似的页面,真是心累,本着追求技术的客观态度,我便模仿下支付宝做一个页面。
    个人博客 :https://www.linit.space

    好多人求源码,公司的源码当然不会给啦。但是你们把你们的demo发我邮箱,我可以帮忙修改下。邮箱 001@linit.space 觉得我修改的辛苦记得给打赏啊T T

    一. 支付宝页面设计
    zhifubaotujie2.jpeg
    zhifubaotujie1.jpeg

    ==可以在图中发现有以下的难点==

    1. 手势需要传递,滑动上半部分结果是滑动下半部分。
    2. UI需要变动,向上滑动的时候,顶部部分收缩。

    ==解决思路==

    WechatIMG8.jpeg
    1. 接受手势信息由一个屏幕大小的UIScrollView(A)接受。响应者为下半部分为一个UIScrollView(B)。这样即可实现点击屏幕任何位置,滑动的部分均为UIScrollView(B)。
    2. 问题来了,既然只有下面的UIScrollView移动,如何做到上面的也一起动呢。这里用一个傻一点的办法,就是监听下面UIScrollView(B)contentOffset的变化,然后控制上部分内容的显示。
    3. 这里有个坑,往上移动UIScrollView(B)上半部分内容逐渐变小,可是UIScrollView(B)的frame不变,也就是说UIScrollView(B)还是在这个位置,但是看起来明明像是UIScrollView(B)也移动上去一样。于是,可以将UIScrollView(B)的clipsToBounds设置为NO。这样,超出frame 的部分仍然可以显示。
    4. 现在看起来的效果是满足了,但是大家肯定都会发现挪出frame的部分不能响应事件啊!这时候可以重写系统自带的
      - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法来解决这个问题。

    ==关键代码==

    1. 解决手势传递问题
     //移除scrollViewA原有手势操作
    NSMutableArray *list = [NSMutableArray arrayWithArray:scrollViewA.gestureRecognizers];
        for (UIGestureRecognizer *gestureRecognizer in list) {
            [scrollViewA removeGestureRecognizer:gestureRecognizer];
    }
    
    //将scrollViewB的手势操作加到scrollViewA中
    for (UIGestureRecognizer *gestureRecognizer in scrollViewB.gestureRecognizers) {
            [scrollViewA addGestureRecognizer:gestureRecognizer];
    }
    

    2.解决头部view和下面的scrollViewB一起滚动的问题,直接使用kvo 监听contentOffset变化就完事。
    3.超出scrollViewB部分可以点击

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        for (UIView *subview in [self.subviews reverseObjectEnumerator]) {
            
            CGPoint convertedPoint = [subview convertPoint:point fromView:self];
            UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
            if (hitTestView) {
                return hitTestView;
            }
        }
        return [super hitTest:point withEvent:event];
    }
    
    
    二. 咱公司的app 掌医2.0的 挂号主页

    演示

    2016-09-21 17_42_35.gif

    ==内容更加复杂 因为下部分不只一个 scrollViewB 不过大同小异,关键部分还是以上代码,代码就不贴了也不外传,同事自行看svn==

    相关文章

      网友评论

      • 西叶lv:请问,我监测底部的滑动偏移量contentOffset.y,然后去重设headerView的frame,这样的显示是headerView和底部的ScrollViewB(我的ScrollViewB实际是tableView)一块滑动,但是tableView得cell也在向上移动,这个逻辑我是不是弄错了
      • PGOne爱吃饺子:楼主代码贴的不全吧,尤其是下拉加载的时候,tableView的contenSize要时时更新,而且scrollviewB的contenSize也要时时更新,这里的代码应该也要说一下吧
      • MI移动:求你们公司的这个页面的代码,
        找了好久.邮箱:1206685852@qq.com
        谢谢
      • 程守斌:打赏求这个页面demo,发15757117989@163.com谢谢:smile:
        Pircate:@程守斌 https://github.com/CodeABug/AlipayHomePageDemo
        程守斌:@码了个bug_gaoX 可以谢谢
        Pircate:我用swift实现了,还需要吗
      • 程守斌:求demo
      • charleswang:楼主可以发个demo么?谢谢 457790959@qq.com
      • brandentang:请问您的安卓同事有实现这个功能吗
      • 夜的v:你好,请教个问题。我在刷新数据的时候后取到collection view的contentSize.height 值H.然后设置collectionview B的高度为值H,接着设置ScrollView A的contentSize为 H + 头部高度。但是这样设置了并不起作用,想请教下你是怎么在刷新完数据后跟新这些值的?
      • barry:你们的APp叫什么名字, 上架了吗,
      • barry:scrollB上加个tableview,刷新要加到tableview上 用什么注意的吗
      • 不会算卦的杨大仙:。。。。。哥们儿别这样 写个demo也不算泄露代码吧
      • JeffWei:就你们自己的项目
        疑问1.下拉刷新的刷新头是在“放房子院区"那3个标签的头部,说明这3个标签也在ScrollViewB,那么为什么标签能停留在上部而不是划出去,是否另外做了个隐藏着到时机显示
        疑问2.侧滑是如何解决的,如果是ScrollViewB里套了2个TableView,弹簧效果怎么处理的。(没办法只上下弹簧左右不弹簧)
        项目刚好要用到类似效果,麻烦解答下,谢谢了
        程序员咿呀咿呀哟:@JeffWei 嗯就是这样的。ScrollViewB里再套n个ScrollView每个里面套一个TableView

        n个ScrollView 要做个 点击范围控制
        程序员咿呀咿呀哟:@JeffWei 所有地方都没做 隐藏。 就是控制了下 位置。那个三个标签的
        if (frame1.origin.y > 0) {
        frame1.origin.y = 0;
        } 做了 类似这个判断。 kvo里做的

        然后 由弹簧效果的啊 左右弹簧效果?那是啥。。。 上下弹簧效果有的啊 。用的就是tableview 自带的 因为对tableview 的操作只是修改了frame 没改其他的
        JeffWei:疑问2续:突然想到,好像是子在ScrollViewB里再套2个ScrollView,每个里面套一个TableView好像能解?
      • 傲世泡泡:求源码
      • 95a63e375514:这实现的有问题,当上滑的时候,
        tableView的.contentOffset > 0,
        frame没变,内容已经上移,可此时,并不能上移,
        而是顶部的视图渐变.
        程序员咿呀咿呀哟:@七槿年华一颗心 啥。没看懂你的描述
      • 95a63e375514:求你们公司的这个页面的代码,
        找了好久.邮箱:9445201@qq.com
        谢谢
        6960c5e09fce:仿支付宝的写好了没呢,需要帮助
      • 奈何为之爱:新手求教,,如果ScrollViewB是tableView,怎么改变他们的frame实现文中效果,我直接把tableView的偏移量赋给A,发现整个视图都上去了:cold_sweat:
        程序员咿呀咿呀哟:@奈何为之爱 B里面嵌套tableview
      • 沙暴送葬:可以说一下你公司这个页面的视图层吗
      • defef388b4fa:时间久了,楼主发一下demo呗,1810472808@qq.com
        6960c5e09fce:仿支付宝首页的写好没?
      • _YZG_:哥哥,有仿支付宝的么
      • 492b9b7cf804:我好奇的是怎么在一直下拉的时候的过程中顶部固定后继续下拉的话刷新,不知道我有没有把问题表达清楚:joy:
        39bf84487cca:楼主,有支付宝更多页面的demo吗?
        程序员咿呀咿呀哟:顶部和下拉的本来就不是一个东西。所以只要在kvo里控制下就好了
      • ab397b8251f2:兄弟,我正好需要这样的一个功能,麻烦能多贴一些代码出来吗,不知道怎么实现
        Young_5818:@程序员咿呀咿呀哟 表述有误,collectionView不是也可以滑动吗,上拉时scrollViewB(collectionView)也在滑动,一部分不在界面上
        程序员咿呀咿呀哟:@bc437c495fb1 啥叫走到ScrollViewA下面去了,ScrollViewB盖在他上面不就好了?
        程序员咿呀咿呀哟:就是监听contentOffset然后调整上面的跟着移动这地方的frame啊
      • DanielTse:scrollViewB是哪个控件?1.tableView 2.scrollView内嵌tableView?
        辰北:@程序员咿呀咿呀哟 就是如何计算这个frame 我计算了好多方法 都是不对的
        程序员咿呀咿呀哟:@DanielTse 2噢。如果要实现图片上的效果。 tableview的frame要计算过
      • jisa:搞定了,视图的层级顺序搞错了。
      • jisa:如何把tableView上的手势传递到UIScrollviewA那。直接添加好像有问题啊。
        jisa:@程序员咿呀咿呀哟 我的需求跟你们的界面很相识,在UIScrollViewB上,加了一个collectionview,我把,collectionview的手势,移除并添加在了,UIScrollviewA上,但是这样。collectionview就响应点击事件了。你们是怎么实现的那。
        程序员咿呀咿呀哟:@程序员咿呀咿呀哟 的bug
        程序员咿呀咿呀哟:@jisa UIScrollviewb 不是tableview
        如果 UIScrollviewb是tableview 会遇到自动释放的不给 达不到文中的效果
        你所说的 有啥问题是啥问题
      • 9cca854c1448:已发邮件 莫辜负
        程序员咿呀咿呀哟:@9cca854c1448 回了。。不懂可以追问
      • dawnnnnn:clipToBounds设置为NO之后 如果下面不是scrollView 而是tableView呢 cell超出之后 不就会被销毁么
        天天都在衰老:@程序员咿呀咿呀哟 如果tableView的高度根据内容调整,那cell就不会重用,如果这个tableView 有上啦加载更多数据的话,随着数据的增多,cell创建的会越来越多,会影响性能的呢,有什么更好的解决办法吗。
        程序员咿呀咿呀哟:@9cca854c1448 是这样的 下面可不单是tableView
        而是一个scrollview(这个scrollview的contentSize要根据内部tableView的大小变化)包含着一个tableview (这个tableview的高度要根据内容调整)滑动的实际是scrollview 。tableview没有动哦,所以不存在tableView呢 cell超出之后自动销毁
        9cca854c1448:@dawnnnnn :dizzy_face:
      • lhq_cd:写给同事看,贴出来毛用?
        程序员咿呀咿呀哟:@coderHQLee 诶呀 核心代码 我都出来了嘛
      • 程序员咿呀咿呀哟:错别字较多。。。我在我博客里改了 简书这就不更新了 😁
        39bf84487cca:楼主,有支付宝首页点击更多,来到更多页面的demo吗?
      • 漫步的小蚂蚁:不错啊,楼主再多贴点代码吧:yum::yum::yum:
        程序员咿呀咿呀哟:@漫步的小蚂蚁 😂 主要代码都在这里

      本文标题:iOS - 仿支付宝(9.9.2)首页页面滚动

      本文链接:https://www.haomeiwen.com/subject/rjbaettx.html