Swift 两个滚动视图之间的平滑过渡

Swift 两个滚动视图之间的平滑过渡,swift,uiscrollview,xlpagertabstrip,Swift,Uiscrollview,Xlpagertabstrip,正如您在下面看到的,我有一个ViewController(我们称之为ViewController a),它包含一个容器视图,其中包含一个ViewController(我们称之为ViewController B) 因此,下面发生的事情是当您向上滚动ViewController A的scrollview时,直到选项卡视图到达顶部为止。一旦选项卡视图到达顶部,ViewController B的scrollview就会接管并开始在容器视图中滚动。当您向下滚动时,viewController B的scro

正如您在下面看到的,我有一个ViewController(我们称之为ViewController a),它包含一个容器视图,其中包含一个ViewController(我们称之为ViewController B)

因此,下面发生的事情是当您向上滚动ViewController A的scrollview时,直到选项卡视图到达顶部为止。一旦选项卡视图到达顶部,ViewController B的scrollview就会接管并开始在容器视图中滚动。当您向下滚动时,viewController B的scrollview会一直滚动到顶部可见,然后viewController A的scrollview会将标题视图向下拉

问题

因此,滚动功能的工作方式正是我想要的,但我的问题是,当滚动视图在彼此之间切换时,它并不平滑。在识别右滚动视图之前,用户必须抬起屏幕的手指并将其放下。当用户向上或向下滑动ScrollView时,如何使其在彼此之间平滑切换而不必停止?就像自动转换一样

我看过其他的帖子,但是我没有找到任何有帮助的,所以我非常感谢你的帮助。提前谢谢

视图控制器A

import Foundation
import UIKit
import XLPagerTabStrip

class viewControllerA: ButtonBarPagerTabStripViewController {

      @IBOutlet weak var containerHeightConstraint: NSLayoutConstraint!
      @IBOutlet weak var scrollView: UIScrollView! 
      @IBOutlet weak var contentView: UIView!
      @IBOutlet weak var headerView: HeaderView!
      @IBOutlet weak var tabView: ButtonBarView!    
      @IBOutlet weak var viewContainer: UIScrollView!

        override func viewDidLoad() {

       self.scrollView.delegate = self

           NotificationCenter.default.addObserver(self, selector: #selector(EnableScroll), name: NSNotification.Name(rawValue: "enableScroll"), object: nil)

            containerView.isScrollEnabled = false
            self.containerView.bounces = false

            super.viewDidLoad()
        }

    @objc func EnableScroll() {
        self.scrollView.isScrollEnabled = true
    }

        override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let yOffset = scrollView.contentOffset.y
        if scrollView == self.scrollView {
            if yOffset >= 250 {
                //tabView has reached the top
                //enable ViewController B's scrollViews
                 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "EnableScroll"), object: nil)
            }
        }
    }
}
视图控制器B

class viewControllerB: UIViewController, IndicatorInfoProvider, UIScrollViewDelegate {

    @IBOutlet weak var scrollView: UIScrollView!

     override func viewDidLoad() {
       super.viewDidLoad(

   self.scrollView.delegate = self

  NotificationCenter.default.addObserver(self, selector: #selector(EnableScroll), name: NSNotification.Name(rawValue: "EnableScroll"), object: nil)
        }

     @objc func EnableScroll() {        
        self.scrollView.isScrollEnabled = true       
            }

      Override func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let yOffset = scrollView.contentOffset.y
        if scrollView == self.scrollView {
            if yOffset <= 0 {
                //scrolling down, top of ViewControllerB is full in view
                self.scrollView.isScrollEnabled = false
                //enables ViewController A's scrollview
                 NotificationCenter.default.post(name: NSNotification.Name(rawValue: "enableScroll"), object: nil)

            }
        }
    }
}
类viewControllerB:UIViewController、IndicationInfo提供程序、UIScrollViewDelegate{
@iBCROLLVIEW:UIScrollView!
重写func viewDidLoad(){
super.viewDidLoad(
self.scrollView.delegate=self
NotificationCenter.default.addObserver(self,选择器:#选择器(EnableScroll),名称:NSNotification.name(rawValue:“EnableScroll”),对象:nil)
}
@objc func EnableScroll(){
self.scrollView.isScrollEnabled=true
}
重写func scrollViewDidScroll(scrollView:UIScrollView){
设yOffset=scrollView.contentOffset.y
如果scrollView==self.scrollView{

如果设置了yOffset,则只需一个控制器和一个
UITableView
即可实现相同的效果,使用
tableHeaderView
作为标题视图,使用节标题视图作为选项卡视图。您是否严格要求将实现拆分为两个控制器?选项卡视图实际上有3个选项卡,显示3个不同的视图控件llers但是为了这个问题,我把它做得像一个简单的东西。所以为了回答你的问题,我确实需要将实现分成两个视图控制器。我尝试使用从vcB到vcA的协议委托,这样我就可以在vcA中实现scrollViewDidScroll,但我无法正确实现。你还有其他建议吗ons?我发现这个解决方案非常有用: