【问题标题】:UIPageViewController's child ViewController acting weirdUIPageViewController 子视图控制器行为怪异
【发布时间】:2015-04-30 20:42:26
【问题描述】:

我有一个UIPageViewController(父母)管理多个UIViewControllers(孩子)。子 VC 只有 1 个 UIImageView,具有以下约束:0 px 左右,0 px 顶部布局指南,20px 到 底部布局指南

当我在Forward 方向更改页面时,它的行为正确。当我在Backward 方向更改页面时,说UIImageView 在过渡动画期间似乎覆盖了整个空间(类似于没有约束时的样子),并且当过渡完成时,它会更正它的位置.

长话短说,当向后翻页时,图像在动画过程中显得更大,然后它会变为正确的大小。为什么会这样?

PS:我创建了一个样板“基于页面的应用程序”,但它没有发生

编辑: 我的故事板嵌套了几个 VC,如下所示:TabBarController -> UINavigationController -> UIPageViewController。 pageVC托管的VC是在代码中动态添加的。

我已经尝试将 UIImageView 约束设置为父母,我注意到两件事:

  1. 图像的顶部被导航栏隐藏。
  2. 问题依然存在

有什么想法吗?

编辑:2

我的NavigationController 托管了一个 推送 UIPageViewController 的 VC(也许这不是它应该做的?),所以我并没有真正通过代码“添加” UIPageViewController。我通过代码添加它的孩子。这是一个SS

此外,孩子只是一个 UIViewControllerUIImageView0 约束到容器视图(不是布局指南),所以它覆盖了整个空间。

【问题讨论】:

标签: ios xcode swift ios8


【解决方案1】:

问题是 UIPageViewController 的框架,当我们从情节提要中实例化它时,视图框架等于屏幕框架(没有 topLayoutGuide 和 bottomLayoutGuide),并且子视图控制器也采用相同的框架...

所以要解决这个问题,我们有两个解决方案:

第一种解决方案

将topLayoutGuide和bottomLayoutGuide约束添加到imageView,但是使用这个解决方案我们会遇到一些动画问题,因为只有在页面完全显示时才会计算框架(您可以在此处找到更多详细信息:https://stackoverflow.com/a/29589531/2477632

第二种解决方案

1- 以不同方式实例化 MagazinePagesViewController :创建 MagazinePagesViewController 与 UIViewController 超类(和 不是 UIPageViewController)

2- 以编程方式添加 pageViewController

let pageViewController = UIPageViewController(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil)
pageViewController.view.frame = view.frame //add also some constraints if needed to support rotation
view.addSubview(pageViewController.view)
addChildViewController(pageViewController)
pageViewController.didMoveToParentViewController(self)

如果需要,我可以上传带有这两个解决方案的示例代码。

希望有帮助

【讨论】:

  • 我要试试这个,能给我你说的示例代码吗,提前谢谢
  • 我尝试了第二种解决方案,它仍然在发生。我将 segue 更改为 Modal,但它没有发生,所以我认为 TOP 约束需要考虑导航栏高度,问题是我不知道我是否应该对值进行硬编码,或者是否有类似于 Top Layout 的东西这样做的指南?
  • 你是对的,对于第二个解决方案,我们必须添加约束才能工作,对于你的问题,顶部布局指南很好:) 你可以在这里找到示例(第二个解决方案的约束)@ 987654322@,我会尽快更新我的答案。希望有帮助
  • 我爱你 ;-;非常感谢,第二个解决方案有效。我认为我缺少的是您在 viewDidLoad() 期间设置的约束
  • @HamzaGhazouani 你能重新发布代码吗?使用 gist 或其他不会过期的东西,在此先感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
相关资源
最近更新 更多