2017-05-05 69 views
1

最终目标是创建与twitter iOS应用程序的“我”选项卡上的滚动效果相同的滚动效果,其中分段控件在向下滚动时上升到顶部,然后保持固定它,除非滚动回顶部。无论触摸发生在哪里,滚动UIScrollView

我想出的解决方案如下所示。顶部有一个视图,分段控件和分段控件下的表视图。所有这些元素都嵌入在滚动视图中,占用整个屏幕(减去标签&导航栏)。

这是一个关键问题:如果通过从顶部视图或分段控件向上滑动来开始滚动,它会滚动所有元素所嵌入的滚动视图。如果我滚动tableview,它只会自动滚动并保留最顶层视图和分段控制不受影响。

无论滚动发生在屏幕上的哪个位置,我如何滚动元素所嵌入的滚动视图?

enter image description here

回答

1

我在项目中的一个也有类似的布局。我用SJSegmentedViewController

它需要一个headerViewController,中间段的数据源和这些段的viewController数组。

此库允许您从屏幕上的任意位置进行滚动,此外,当用户一直滚动到顶部时,分段控件会粘到顶部。

这里是你如何实现这一点:

首先导入模块到类

import SJSegmentedScrollView 

然后创建一个headerViewController和两个viewControllers(说视频和技巧)的段

let headerViewController = HeaderViewController() 
let video = VideoController() 
let tips = TipsController() 

之后,设置这些控制器,并设置分段控制的标题如下:

segmentController.headerViewController = header 
segmentController.segmentControllers = [video,tips] 
video.title = "Video" 
tips.title = "Tips" 

然后将其添加到容器视图

addChildViewController(segmentController) 
containerView.addSubview(segmentController.view) 
segmentController.view.frame = self.containerView.bounds 
segmentController.didMove(toParentViewController: self) 

这里容器视图是一个UIContainerView

最后,但要确保在儿童控制器(视频控制器,TipsController)调用,调用该函数后在这些控制器中,您可以从屏幕上的任何位置滚动。

extension HomeListingViewController: SJSegmentedViewControllerViewSource { 

    func viewForSegmentControllerToObserveContentOffsetChange() -> UIView { 
     //Scrollview in child controllers 
     return scrollview 
    } 
} 

你可以找到完整的文档here

希望这有助于!