繁体   English   中英

如何将 UIPageViewController 添加到 UIStackView(在 UIScrollView 内)

[英]How to add a UIPageViewController to a UIStackView (inside a UIScrollView)

我正在尝试将 UIPageViewController 添加到 UIScrollView 内的 UIStackView,但我只能看到 UIPageViewController 应该在的一些空白空间(200px 高度)。

我的代码如下:

class ViewController: UIViewController {
    var scrollView: UIScrollView!
    var pageViewController: UIPageViewController!
    var controllers: [UIViewController] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        scrollView = UIScrollView()
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(scrollView)
        
        let frameLayoutGuide = scrollView.frameLayoutGuide
        frameLayoutGuide.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        frameLayoutGuide.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        frameLayoutGuide.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        frameLayoutGuide.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true

        let contentLayoutGuide = scrollView.contentLayoutGuide
        contentLayoutGuide.widthAnchor.constraint(equalTo: frameLayoutGuide.widthAnchor).isActive = true
        
        let contentView = UIStackView()
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.axis = .vertical
        scrollView.addSubview(contentView)
        
        contentLayoutGuide.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
        contentLayoutGuide.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
        contentLayoutGuide.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
        contentLayoutGuide.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
        
        // ---
        
        let view1 = UIView()
        view1.translatesAutoresizingMaskIntoConstraints = false
        view1.heightAnchor.constraint(equalToConstant: 250).isActive = true
        view1.backgroundColor = .red
        contentView.addArrangedSubview(view1)
        
        //
        
        let controller1 = UIViewController()
        controller1.view.backgroundColor = .black
        controllers.append(controller1)

        let controller2 = UIViewController()
        controller2.view.backgroundColor = .darkGray
        controllers.append(controller2)
        
        let controller3 = UIViewController()
        controller3.view.backgroundColor = .gray
        controllers.append(controller3)
        
        pageViewController = UIPageViewController()
        pageViewController.dataSource = self
        pageViewController.view.translatesAutoresizingMaskIntoConstraints = false
        pageViewController.view.heightAnchor.constraint(equalToConstant: 200).isActive = true

        addChild(pageViewController)
        contentView.addArrangedSubview(pageViewController.view)
        pageViewController.didMove(toParent: self)

        //
        
        let view2 = UIView()
        view2.translatesAutoresizingMaskIntoConstraints = false
        view2.heightAnchor.constraint(equalToConstant: 400).isActive = true
        view2.backgroundColor = .orange
        contentView.addArrangedSubview(view2)
    }
}

extension ViewController: UIPageViewControllerDataSource {
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        if let index = controllers.firstIndex(of: viewController), index > 0 {
          return controllers[index - 1]
        }
        return nil
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        if let index = controllers.firstIndex(of: viewController), index < controllers.endIndex - 1 {
            return controllers[index + 1]
        }
        return nil
    }
    
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
      return controllers.count
    }
      
    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
      return 0
    }
}

请注意,view1 和view2 已正确显示。

解决方案很简单:使用一些选项构造 UIPageViewController,并声明第一个视图控制器。

pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
pageViewController.setViewControllers([controllers.first!], direction: .forward, animated: false, completion: nil)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM