UIPageViewController 必须全屏吗?

Posted

技术标签:

【中文标题】UIPageViewController 必须全屏吗?【英文标题】:Does UIPageViewController have to be full screen? 【发布时间】:2014-10-28 09:58:58 【问题描述】:

UIPageViewController 必须全屏吗? 是否可以将其嵌入到其他可视容器中的较小矩形中,例如 UIViewUINavigationControllerUITabBarController 的一角?

【问题讨论】:

【参考方案1】:

不,它不必是全屏。事实上,它可以用作任何其他UIViewController。如果你想把它嵌入到一个更小的矩形中,你可以使用UIViewController containment。

假设您要将其嵌入到父控制器中,该父控制器是UIViewController 子类。然后定义一个pageViewController属性并将其作为子视图控制器添加到viewDidLoad中:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.view.frame = ... //set the frame or add autolayout constraints

[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];

【讨论】:

你是对的,你可以将 pageViewController 嵌入到 UIViewController 中,它的框架比屏幕的框架小。不幸的是,与 pageViewController 与屏幕大小相同时,从一个内容 ViewController 滑动到另一个内容太快且太敏感。 UIPageViewController 是错误的,或者我实现它并不完全正确......你有同样的问题吗?如果你这样做了,你能解决它吗? 我遇到的问题是控制器加载的页面没有相对于ITS顶部定位;它似乎继续将加载的页面定位在屏幕顶部,而不是 pageViewController 的框架顶部实际所在的位置。这样每一页的顶部就被剪掉了。【参考方案2】:

虽然从技术上来说答案是肯定的,但 UIPageViewController 会将其页面定位在屏幕顶部,即使它自己的框架从屏幕下方开始。结果是您的页面顶部将被切断。

我试图通过将加载页面的框架设置为与 pageController 的视图相匹配来解决此问题,但遇到了几个问题。其中之一是在视图出现之前没有设置框架,从而导致可见的偏移。您不能使用 viewWillAppear 来防止这种情况,因为这不是在 pageView 控制器上调用的,而是在子级上调用的。

您可以通过对页面进行布局以将其所有内容向下移动到足以让您看到的程度来解决此问题,但当然这是一种不太灵活的硬编码解决方案。

可能有一个程序化的解决方案;我考虑将每个页面上的内容放到 UIScrollView 上,并尝试根据 UIPageView 的运行时框架找到设置内容偏移的时间。

【讨论】:

以上是关于UIPageViewController 必须全屏吗?的主要内容,如果未能解决你的问题,请参考以下文章

2 UIPageViewController 手势冲突

UIPageViewController 动画表示可以滑动

刷新一个 UIPageViewController

在视图控制器/页面视图控制器中使图像视图全屏显示(swift)

UIPageViewController 取消页面滑动

防止 UIPageViewController 的滑动影响 UISlider