ios - UIPresentation Controller - 从后台返回后布局出错

标签 ios swift autolayout uipresentationcontroller

我实现了从 ViewController A(嵌入 UINavigationController 中)到 ViewController B 的自定义转换。

过渡从底部“滑动”VC B,直到占据垂直屏幕尺寸的 1/2 - 使用自定义 UIViewControllerAnimatedTransitioning 对象。自定义演示文稿还会移动正在演示的 VC A,以便使用在 presentationWillBegin() 重写中调用的 animateAlongsideTransition(in:animation:compeltion) 与传入的 VC B 一起向上滑动UIPresentationContorller。想象一下分屏,其中呈现的 VC 的下 1/2 位于顶部,呈现的 VC 位于底部。

一切都按预期进行,除了一个我似乎无法解决的棘手案例:

  • VC A 有一些 subview (按钮),这些 subview (在界面生成器中自动布局)受到 VC A 顶部布局指南的约束(同样,VC A 位于 NavC 中)。
  • 当我呈现模态视图 (B) 时,这些 subview 作为过渡的一部分被向上推(很棒),而当 VC B 被关闭时,这些 subview 会再次向下推(很棒)。
  • 但是当 VC B 出现时,应用程序被放入后台然后返回前台,VC A 的 subview 显示在屏幕顶部 - 即在 VC A View 的中间而不是顶部(不好) 。当 VC B 被解雇时,它们停留在中间(不好) - 只有通过导航出 VC A 并返回来启动完整的 VC“重绘”才能解决问题。

我知道问题在某种程度上在于返回前台时重新校准顶部布局指南,但在显示 View 之前无法弄清楚如何修复它。

一种方法是将 subview 的约束设置为“ super View 顶部”而不是“顶部布局指南”,但这会击败作为 NavC 一部分的自动布局的要点。

  • 在这种情况下,VC A 的 viewWillAppear/viewWillDisappear 永远不会被调用(因为 VC A 的 View 永远不会被完全忽略)。
  • 在这种情况下,自定义 UIPresentationController
  • containerViewWillLayoutSubviews/containerViewDidLayoutSubviews 也未调用

非常感谢任何想法。

iOS 10、Xcode 8.3

最佳答案

使用 Xcode 9 编译并在 iOS 11 上运行似乎已经解决了这个问题。 引用我上面的描述,在 Xcode 9/iOS 11 中:

当 VC B 关闭时,VC A 的按钮会自动重新定位在 VC A 的顶部。重新定位不是动画,看起来很奇怪,但它按预期工作,并遵守顶部布局指南的自动布局约束。

关于ios - UIPresentation Controller - 从后台返回后布局出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46184179/

相关文章:

ios - 调整 PopOver View Controller 的大小

swift - NSDate timeIntervalSinceDate 计算错误 60 分钟

ios - UIScrollView 动态高度内容(自动布局)未填满整个空间

ios - 限制 Storyboard 中的警告

ios - 无法将具有 App Clip 目标的二进制文件上传到 App Store - 错误 ITMS-90834

ios - 如何为Xcode6制作插件

ios - Apple Mach-O 链接器和同上错误 - Xcode 8

android - IOS/Android Phonegap 应用程序可以只链接到网站吗?

ios - Framework ViewController View 未显示

iOS:使用 UIViewControllerTransitioningDelegate 扩展 View 时 UILabel 未居中