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

Posted

技术标签:

【中文标题】Twitter个人资料页面iOS Swift剖析(UIScrollView中的多个UITableViews)【英文标题】:Twitter profile page iOS Swift dissection (Multiple UITableViews in UIScrollView) 【发布时间】:2017-06-10 12:19:20 【问题描述】:

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

第二件事他们如何处理子表......他们是containerView吗? 如果是这样,那么结构将是这样的

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")
        

但是这个解决方案有一些缺点......其中一个是首先当子滚动视图位于顶部或按钮时,应该有两个尝试调用我的父滚动视图来处理滚动,首先尝试我禁用孩子滚动视图,然后在第二次尝试父滚动视图处理滚动

** 当你,我的孩子,向上滚动时,我该怎么说,检查你的父母是否在顶部,然后让他处理滚动,当他触摸底部时,你可以处理保持向上滚动,或者告诉父母scrollview ,如果你在顶部(用户信息可见)如果你或你的孩子起床滚动,首先你处理滚动,当你在底部丰富时(用户信息不可见),让你的孩子保持滚动**

【问题讨论】:

您找到解决方案了吗?我只是被困在这里。 是的,我找到了一个库,让我找到链接,这里是github.com/maxep/MXSegmentedPager,我在一个项目中使用它,它工作正常, 如果没问题,请给我点赞 我已经在使用这个库了。我想从我的项目中删除它,这就是我问的原因。好的,谢谢你的回复。 我想知道你是如何自定义这个库的。因为 twitter 个人资料是不同的,特别是标题部分。还有我想删除的segue。 【参考方案1】:

经过长时间的调查,这就是我实现 twitter 个人资料行为的方式。

UnderlayScrollView MasterScrollView 标题视图控制器 底部视图控制器 PagerTabItems [CollectionView] UIPagerController 或任何其他水平滚动条(Parchment、XLPagerTabStrip)。

UnderlayScrollView 负责控制滚动手势。它的 contentoffset 用于调整内滚动 contentOffsets。底层滚动的内容大小与主滚动的内容大小相同。

更多信息请参见 github 上的源代码。 click

【讨论】:

【参考方案2】:

我找到了一个图书馆, https://github.com/maxep/MXSegmentedPager 它完全可以正常工作

【讨论】:

当你从顶视图滚动并让它减速到下面的表格视图时,它不起作用的一种情况。在示例中,当自定义分段控件到达顶部时,减速停止,而在 Twitter 应用程序中,它继续滚动。它可能很小,可以忽略,但只想指出。【参考方案3】:

我相信你大部分是对的,除了最上面的滚动视图。

在最近的一个应用程序中,我在tutorial 之后实现了类似的功能:

基本上,诀窍是让一个类成为底部UITableViews 的滚动代理,监听scrollViewDidScroll 的修改,并修改UITableViewTopView 的顶部插入。

我会使用的结构是这样的:

Topview
ScrollView (horizontal scroll)
  Segmented Control
ScrollView (horizontal, paging scroll)
  UITableView
  UITableView
  UITableView
  UITableView

你是完全正确的,它令人兴奋。看起来很简单。

【讨论】:

感谢您的回答,我在父母和孩子之间实现了一个协议,现在我可以接收所有孩子的滚动...但是我怎么能说当你,我的孩子,上去时,检查你的父母在顶部,然后让他处理滚动,当他触摸底部时,您可以处理保持向上滚动...

以上是关于Twitter个人资料页面iOS Swift剖析(UIScrollView中的多个UITableViews)的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 2 Twitter登录集成

ios学习:swift中实现分享到微博facebook,twitter等

Firebase Twitter oAuth 回调不适用于 Swift ios13

Swift:通过深度链接到 Twitter 应用程序将图像共享到 Twitter

在 iOS 中从 Twitter 获取用户个人资料详细信息(尤其是电子邮件地址)

当Apple从设置中删除时,如何在Xcode 9 Simulator中访问Twitter?