我实现了从 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 永远不会被完全忽略)。
在这种情况下,自定义 containerViewWillLayoutSubviews/containerViewDidLayoutSubviews
也未调用
UIPresentationController
的 非常感谢任何想法。
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/