Вы можете использовать приведенный ниже код, чтобы настроить свой контроллер страницы, добавить новые контроллеры представления в массив страниц. Это не делается с помощью раскадровки, но может быть полезно
class PageController: UIViewController {
var pages = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
let pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: .none)
view.backgroundColor = .clear
pageViewController.dataSource = self
pageViewController.delegate = self
let initialPage = 0
let page1 = CustomController1()
let page2 = CustomController2()
let page3 = CustomController3()
// add the individual viewControllers to the pageViewController
self.pages.append(page1)
self.pages.append(page2)
self.pages.append(page3)
let pageControllerView = pageViewController.view
view.addSubview(pageControllerView!)
addChild(pageViewController)
let dictionary: [String: UIView] = ["pageControllerView": pageControllerView!]
var vflString = "H:|-0-[pageControllerView]-0-|"
var vflConstraints = NSLayoutConstraint.constraints(withVisualFormat: vflString, options: [], metrics: nil, views: dictionary)
NSLayoutConstraint.activate(vflConstraints)
vflString = "V:|-[pageControllerView]-|"
vflConstraints = NSLayoutConstraint.constraints(withVisualFormat: vflString, options: [], metrics: nil, views: dictionary)
NSLayoutConstraint.activate(vflConstraints)
// EDIT:
// Add new view controller on tapping a a button
let button = UIButton(frame: .zero)
button.setTitle("This is a button", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
page1.view.addSubview(button)
button.addTarget(self, action: #selector(addPage), for: .touchUpInside)
var vflString = "V:|-100-[button(50)]"
var vflConstraints = NSLayoutConstraint.constraints(withVisualFormat: vflString,
options: [],
metrics: nil,
views: ["button": button])
page1.view.addConstraints(vflConstraints)
vflString = "H:|-100-[button(50)]"
vflConstraints = NSLayoutConstraint.constraints(withVisualFormat: vflString,
options: [],
metrics: nil,
views: ["button": button])
page1.view.addConstraints(vflConstraints)
pageViewController.setViewControllers([pages[initialPage]], direction: .forward, animated: true, completion: nil)
}
@objc private func addPage() {
let page2 = UIViewController()
page2.view.backgroundColor = .brown
pages.append(page2)
}
}
extension PageController: UIPageViewControllerDataSource, UIPageViewControllerDelegate {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
if let viewControllerIndex = self.pages.firstIndex(of: viewController) {
if viewControllerIndex == 0 {
// wrap to last page in array
return self.pages.last
} else {
// go to previous page in array
return self.pages[viewControllerIndex - 1]
}
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
if let viewControllerIndex = self.pages.firstIndex(of: viewController) {
if viewControllerIndex < self.pages.count - 1 {
// go to next page in array
return self.pages[viewControllerIndex + 1]
} else {
// wrap to first page in array
return self.pages.first
}
}
return nil
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
// set the pageControl.currentPage to the index of the current viewController in pages
if let viewControllers = pageViewController.viewControllers {
if let viewControllerIndex = self.pages.firstIndex(of: viewControllers[0]) {
self.pageControl.currentPage = viewControllerIndex
}
}
}
// The number of items reflected in the page indicator.
func presentationCount(for pageViewController: UIPageViewController) -> Int {
}
// The selected item reflected in the page indicator.
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
return 1
}
}