因此,我有一个UIPageViewController,如果设备处于横向模式,我想将spineLocation实现为.mid,以纵向实现.min,因此在横向模式中显示两个控制器,在纵向模式中显示一个控制器。
在页面视图控制器委托中,我实现了此功能:
func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
if orientation == .landscapeLeft || orientation == .landscapeRight {
return .mid
} else {
return .min
}
}
在我的UIPageViewController类中,要设置视图控制器,我具有此功能:
func setControllers() {
var controllers: [UIViewController] = [controller1]
if spineLocation == .mid {
controllers.append(controller2)
}
setViewControllers(controllers, direction: .forward, animated: true, completion: nil)
}
我的问题是我不确定放在哪里,我尝试过:
视图以纵向模式正确显示,但是当我启动或将设备横向移动时,应用程序崩溃的原因是:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'所提供的视图控制器的数量(1)与请求的主干位置(UIPageViewControllerSpineLocationMid)所需的数量(2)不匹配'
我通过以下方式修复了它:将spineLocation添加为函数setControllers的参数:
func setControllers(forSpineLocation location: SpineLocation) {
var controllers: [UIViewController] = [controller1]
if location == .mid {
controllers.append(controller2)
}
setViewControllers(controllers, direction: .forward, animated: true, completion: nil)
}
并且通过在viewDidLoad和pageViewController(_ pageViewController:UIPageViewController,spineLocationFor direction:UIInterfaceOrientation)上实现它:
override func viewDidLoad() {
super.viewDidLoad()
setControllers(withLocation: spineLocation)
}
func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
var location = SpineLocation.min
if orientation == .landscapeLeft || orientation == .landscapeRight {
location = .mid
}
setControllers(withLocation: location)
return location
}
我不知道这是正确的还是最好的方法,但是它可以工作。