【发布时间】:2014-10-28 09:58:58
【问题描述】:
UIPageViewController 必须全屏吗?
是否可以将其嵌入到其他可视容器中的较小矩形中,例如 UIView、UINavigationController 或 UITabBarController 的一角?
【问题讨论】:
标签: ios objective-c swift uipageviewcontroller
UIPageViewController 必须全屏吗?
是否可以将其嵌入到其他可视容器中的较小矩形中,例如 UIView、UINavigationController 或 UITabBarController 的一角?
【问题讨论】:
标签: ios objective-c swift uipageviewcontroller
不,它不必是全屏。事实上,它可以用作任何其他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];
【讨论】:
虽然从技术上来说答案是肯定的,但 UIPageViewController 会将其页面定位在屏幕顶部,即使它自己的框架从屏幕下方开始。结果是您的页面顶部将被切断。
我试图通过将加载页面的框架设置为与 pageController 的视图相匹配来解决此问题,但遇到了几个问题。其中之一是在视图出现之前没有设置框架,从而导致可见的偏移。您不能使用 viewWillAppear 来防止这种情况,因为这不是在 pageView 控制器上调用的,而是在子级上调用的。
您可以通过对页面进行布局以将其所有内容向下移动到足以让您看到的程度来解决此问题,但当然这是一种不太灵活的硬编码解决方案。
可能有一个程序化的解决方案;我考虑将每个页面上的内容放到 UIScrollView 上,并尝试根据 UIPageView 的运行时框架找到设置内容偏移的时间。
【讨论】: