iOS 8 UIPageViewController在转换后应用约束

时间:2014-09-11 15:14:45

标签: autolayout ios8 xcode6 uipageviewcontroller

我的应用程序有一个多窗格教程样式的视图,用户可以通过该视图了解该应用程序。这与described in this tutorial非常相似。在为iOS 7和8实现它之后,我正在比较它们的工作方式,并找到后者的问题 - 我在这里运行Xcode 6 GM。

似乎UIPageViewController在转换完成后呈现视图。我重写了委托方法,看看发生了什么:

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
   NSLog(@"Frame size before: %@", NSStringFromCGRect([(UIViewController*)pendingViewControllers[0] view].frame));
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
   NSLog(@"Frame size after: %@", NSStringFromCGRect([(UIViewController*)previousViewControllers[0] view].frame));
}

这是一个示例输出:

Frame size before: {{0, 0}, {600, 600}}
Frame size after: {{0, 0}, {320, 568}}

这样表现如下:向左滑动以拉入下一个视图,并在新视图的底部注意一个32磅的空白区域。转换完成后,它会进入正确的布局。

这可能是iOS 8中的错误吗?我现在完全没猜到了。

5 个答案:

答案 0 :(得分:112)

我发现你需要在视图上建立约束,而不是视图控制器的布局指南。这将确保您的视图控制器遵守您在PageViewController中转换之前设置的约束。

你可以这样做:

Constraints example

请记得取消选中“限制到边距”

答案 1 :(得分:41)

对于有这个问题的人来说,对我而言,似乎是我正在“相对于保证金”(iOS 8中的一项新功能)布置视图。

而不是:

enter image description here

使用:

enter image description here

答案 2 :(得分:2)

我几天都在努力解决这个问题。

我尝试通过从故事板中实例化ViewController页面来实现它。有一个明确的大小调整发生。检查

中的帧大小
  1. pageViewController:viewControllerAfterViewController
  2. pageViewController:willTransitionToViewControllers
  3. pageViewController:didFinishAnimating:previousViewControllers
  4. 1 3 的调用之间,帧大小始终会发生变化。有时在 2 之前,有时在之后。

    如果您还在使用故事板,我可以通过将页面UI元素提取到自己的XIB文件中来解决问题,在IB中设置约束,然后通过调用 创建页面initWithNibName 即可。

    不是一个完整的答案,但它让我觉得很有成效。 希望它有所帮助。

答案 3 :(得分:1)

对我来说,解决办法是将tableView的顶部固定到superview: 编辑 - > Pin - >顶级空间到SuperView(iOS8)

答案 4 :(得分:0)

这是iOS 8中的一个错误,但我找到了一个解决方法:

在Storyboard的状态栏顶部添加一个空视图。视图的高度应该与正在移动的对象的y值一样多。

Image of correct constraints