[英]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.