UIPresenting 控制器 - 从后台返回后布局出错



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

过渡从底部"滑动"VC B,直到它采用垂直屏幕尺寸的 1/2 - 使用自定义UIViewControllerAnimatedTransitioning对象。自定义演示文稿还会移动演示 VC A,以便它使用在自定义UIPresentationContorller覆盖中调用animateAlongsideTransition(in:animation:compeltion)与传入的 VC B 一起向上滑动presentationWillBegin()。考虑分屏,顶部是演示 VC 的较低 1/2,底部是呈现的 VC。

一切都按预期工作,除了一个我似乎无法解决的烦人案例:

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

我知道问题出在返回前台时重新校准顶部布局指南,但在显示视图之前无法弄清楚如何解决它。

一种方法是将子视图的约束设置为"超级视图顶部"而不是"顶部布局指南",但这击败了作为 NavC 一部分的自动布局的观点。

  • 在这种情况下,VC A的viewWillAppear/viewWillDisappear从未被调用(因为VC A的观点从未被完全驳回)。
  • 在这种情况下,也不会调用自定义UIPresentationControllercontainerViewWillLayoutSubviews/containerViewDidLayoutSubviews

任何想法都非常感谢。

iOS 10, Xcode 8.3

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

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

最新更新