【问题标题】:UIPresentation controller - layout going wrong after coming back from backgroundUIPresentation 控制器 - 从后台返回后布局出错
【发布时间】:2018-02-21 09:02:01
【问题描述】:

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

过渡从底部“滑动”VC B,直到它占用垂直屏幕大小的 1/2 - 使用自定义 UIViewControllerAnimatedTransitioningobject。自定义演示还移动演示 VC A,因此它使用在自定义 UIPresentationContorllerpresentationWillBegin() 覆盖中调用的 animateAlongsideTransition(in:animation:compeltion) 与传入的 VC B 一起滑动。想象一下分屏,显示的 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 的观点从未被完全否定)。
  • containerViewWillLayoutSubviews/containerViewDidLayoutSubviews 的自定义 UIPresentationController 在这种情况下也没有调用

非常感谢任何想法。

iOS 10、Xcode 8.3

【问题讨论】:

    标签: ios swift autolayout uipresentationcontroller


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2015-01-16
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多