【问题标题】:iOS 8 UIPageViewController Applying Constraints After TransitionsiOS 8 UIPageViewController 在转换后应用约束
【发布时间】:2014-09-11 15:14:44
【问题描述】:

我的应用有一个多窗格的教程式视图,用户可以通过滑动来了解该应用。这与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 中的一个错误吗?在这一点上,我完全猜不透了。

【问题讨论】:

  • 我也按照相同的教程创建了一个 PageViewController 与 2 PageContentViewController 包含一个 UITextView。两者的外观和视图完全相同。实际上,它们是同一类的实例。当我向左滑动以前进到下一个视图时,文本总是跳下一行,因为 contentSize 最后发生了变化。您可以从调试输出中看到这一点。 gist.github.com/5amfung/7918ca8f78556873dfa5
  • 我也有同样的问题,还没解决。

标签: autolayout ios8 xcode6 uipageviewcontroller


【解决方案1】:

我发现您需要将约束基于视图而不是视图控制器的布局指南。这将确保您的视图控制器尊重您在 PageViewController 中转换之前设置的约束。

你可以这样做:

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

【讨论】:

  • 执行此操作后,您可能还必须取消选择“限制到边距”。
  • 感谢您的回答!当然,您需要像@dfickling 所说的那样取消选择“限制到边距”
  • 你太棒了,这正是我需要的!
  • 这假设始终存在状态栏。如果没有,那么您会在顶部留下一个空白 - 例如,当旋转到横向模式时。可以为适当的约束创建一个出口,并根据状态栏的存在将它们更改为运行时。
  • 这很酷。它解决了这个问题。顺便说一句,iOS 9 没有这个问题。
【解决方案2】:

对于遇到此问题的任何人,对我来说,我似乎是在“相对于边距”布置视图(iOS 8 中的一项新功能)。

代替:

用途:

【讨论】:

  • 谢谢谢谢谢谢!呃,这让我难倒了好几个小时。
  • 边距不影响到状态栏的垂直距离(仅适用于前缘和后缘)。
【解决方案3】:

我已经为此苦苦挣扎了几天。

我尝试通过从情节提要中实例化页面 ViewController 来实现它。发生了明确的调整大小。在

中检查帧大小
  1. pageViewController:viewControllerAfterViewController
  2. pageViewController:willTransitionToViewControllers
  3. pageViewController:didFinishAnimating:previousViewControllers

帧大小总是会在调用 13 之间变化。有时在2之前,有时在之后。

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

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

【讨论】:

    【解决方案4】:

    对我来说,解决方案是将 tableView 的顶部固定到 superview: Editor -> Pin -> Top Space To SuperView (iOS8)

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 不幸的是,这似乎对我没有任何帮助。我在顶部放置了一个 32-pt 视图并对其设置了约束。同样的事情正在发生...您能补充一下我可能忽略的任何细节吗?
      • 此处讨论的相同问题:stackoverflow.com/a/25947290/2061520 我发现最简单的解决方案(假设您可以避免自动布局)是取消标记情节提要中的“使用自动布局”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2014-09-30
      • 2015-01-26
      • 2014-11-13
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多