首页 > 解决方案 > UIScrollView 中的子视图控制器

问题描述

我有一个带有 3 个子视图控制器和一个UIScrollView在主视图中的视图控制器。VerticalScrollViewController 的设置代码如下。

func setupScrollView() {
        scrollView = UIScrollView()
        scrollView.isPagingEnabled = true
        scrollView.showsVerticalScrollIndicator = false
        scrollView.bounces = false
        
        let view = (
            x: self.view.bounds.origin.x,
            y: self.view.bounds.origin.y,
            width: self.view.bounds.width,
            height: self.view.bounds.height
        )
        
        scrollView.frame = CGRect(x: view.x, y: view.y, width: view.width, height: view.height)
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(scrollView)
        // These constraints don't seem to affect it and I did try and set the scroll view constraints to the parent views safe area, but that did not work either
        NSLayoutConstraint.activate([scrollView.topAnchor.constraint(equalTo: self.view.topAnchor),
                                     scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
                                     scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
                                     scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)])
        
        
        let scrollWidth: CGFloat  = view.width
        var scrollHeight: CGFloat

        scrollHeight  = 3 * view.height
        topVc.view.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height)
        middleVc.view.frame = CGRect(x: 0, y: view.height, width: view.width, height: view.height)
        bottomVc.view.frame = CGRect(x: 0, y: 2 * view.height, width: view.width, height: view.height)
            
        addChild(topVc)
        addChild(middleVc)
        addChild(bottomVc)
                
        scrollView.addSubview(topVc.view)
        scrollView.addSubview(middleVc.view)
        scrollView.addSubview(bottomVc.view)
            
        topVc.didMove(toParent: self)
        middleVc.didMove(toParent: self)
        bottomVc.didMove(toParent: self)
            
        scrollView.contentOffset.y = middleVc.view.frame.origin.y
        scrollView.contentSize = CGSize(width: scrollWidth, height: scrollHeight)
}

由于某种原因,视图在顶部偏移了大约 50 个点。我的意思是我的视图控制器的视图从所选滚动视图框架的视图的最顶部开始。这会导致 iPhone X 及更高版本上的缺口覆盖其中的一部分。

我的问题是:如何将 3 个视图控制器添加到我的滚动视图并将顶部与 UIScrollView 安全区域对齐?

我尝试激活所有 3 个 VC UIViews 的约束,但这并没有按预期工作。很好,middleVc但是当我滚动时,顶部和底部只是滑到middleVcUIView后面。我确信这是我在约束方面缺少的东西,但我无法使用视图调试器来确定哪些约束以及我应该在哪里添加它们。我在这里查看了一些关于 SO 的问题,但其中大多数都涉及故事板,我正在以编程方式完成所有工作。

标签: iosswiftuiviewuiviewcontrolleruiscrollview

解决方案


推荐阅读