Twitter个人资料页面iOS Swift剖析(UIScrollView中的多个UITableView)

11

在这里输入图片描述

嗨...他们是怎么实现的呢?有几个Twitter个人主页的教程,但它们并没有处理所有可能性... 首先,当您在任何地方向上或向下滚动时,顶部视图开始滚动直到分段控件到达页面顶部...然后滚动不会停止,子表格开始滚动直到接触到并到达中间位置时,tableview开始动态加载其他行...所以我认为他们没有静态设置scrollview的内容

第二个问题是,他们如何处理子表格...它们是容器视图吗? 如果是这样的话,结构会像这样。

ScrollView
  TopView (User Info)
  Segmented Controll
  scrollView(to swipe right or left changing tables)
     ContainerView For  TWEETS
     ContainerView For  TWEETS & REPLIES
     ContainerView For  MEDIA
     ContainerView For  LIKES

我是正确的吗? 那么他们如何处理子表格之间的滚动和顶部滚动视图以实现基于滚动的顶部视图位置更改...

这太让人惊叹了

这就是我如何处理嵌套的滚动视图... 我创建了一个childDidScroll协议,我的子表格实现了它,在我的个人资料页面中,我可以接收所有子didscroll事件,然后在childDidScroll方法中:

   //if child scrollview going up
if(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y > 0)
        {
            //check top scrollview if it is at bottom or top
            //then disable the current scrollview
            if mainScrollView.isAtBottom && scrollView.isAtTop{
                scrollView.isScrollEnabled = false
            }else{
                //else enable scrolling for my childs
                featuresVC.tableView!.isScrollEnabled = true
                categoriesVC.tableView!.isScrollEnabled = true
                shopsVC.tableView!.isScrollEnabled = true
            }
            print("up")
        }
        else
        {
            if mainScrollView.isAtTop {
                scrollView.isScrollEnabled = false
                mainScrollView.scrollToBottom()

            }else{
                featuresVC.tableView!.isScrollEnabled = true
                categoriesVC.tableView!.isScrollEnabled = true
                shopsVC.tableView!.isScrollEnabled = true

            }
            print("down")
        }

但是这个解决方案有一些缺点......其中之一是,当子滚动视图在顶部或底部时,应该有两次尝试调用父滚动视图处理滚动,在第一次尝试中我禁用了子滚动视图,第二次尝试中父滚动视图处理滚动。

** 当你向上滚动时,如何告诉你,我的孩子,请检查您的父母是否在顶部,然后让他处理滚动,当他触摸到底部时,您可以处理其余的向上滚动,或者告诉父滚动视图,如果您在顶部(用户信息可见),如果您或您的孩子正在向上滚动,首先由您处理滚动,当您到达底部(用户信息不可见)时,继续让您的孩子滚动**


你找到解决方案了吗?我现在卡住了。 - Sukhpreet
1
是的,我找到了一个库,让我找一下链接,这里 https://github.com/maxep/MXSegmentedPager,我正在一个项目中使用它,它运行良好。 - Farshad jahanmanesh
If its ok, please upvote me - Farshad jahanmanesh
1
我已经在使用这个库。我想从我的项目中删除它,这就是为什么我问的原因。好的,谢谢回复。 - Sukhpreet
我想知道你是如何定制这个库的。因为Twitter的个人资料页面与其他网站不同,特别是页眉部分。此外,还有一些我想要删除的segue。 - Sukhpreet
显示剩余2条评论
3个回答

5
经过长时间的调查研究,我实现了 Twitter 用户档案的行为。
  • UnderlayScrollView
  • MasterScrollView
    • Header ViewController
    • Bottom ViewController
      • PagerTabItems [CollectionView]
      • UIPagerController 或者任何其他水平滚动控件 (Parchment, XLPagerTabStrip)。
UnderlayScrollView 负责控制滚动手势,其 contentoffset 被用于调整内部滚动内容的 contentOffsets。底层滚动视图的 Contentsize 与 MasterScrollView 的 Contentsize 相同。
欲了解更多详情请访问 GitHub 上的源代码:点击此处

1
我相信你大部分是正确的,除了最上面的滚动视图。
最近我开发的一个应用中,我按照这个tutorial实现了类似的功能:
基本上,诀窍是让一个类成为底部UITableView的滚动代理,监听scrollViewDidScroll的修改,并修改UITableView和TopView的顶部插入。
我将使用的结构如下:
Topview
ScrollView (horizontal scroll)
  Segmented Control
ScrollView (horizontal, paging scroll)
  UITableView
  UITableView
  UITableView
  UITableView

你完全正确,这是令人惊叹的。看起来非常简单。


谢谢你的回答,我实现了一个父子之间的协议,现在我可以接收到所有子视图的滚动事件...但是当你向上滚动时,我该怎么知道你的父视图是否在顶部,然后让他来处理滚动事件,当他触底时,你就可以处理剩下的向上滚动... - Farshad jahanmanesh

1

有一种情况它不起作用,就是当您从顶部视图滚动并让其减速到下面的tableview时。在示例中,当自定义分段控件到达顶部时,减速停止,而在Twitter应用程序中,它会继续滚动。这可能足够小,可以忽略,但只是想指出。 - Hlung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接