UIKitCore布局指南死锁

3
我正在创建一个弹出菜单。它有一个UIPresentationController,根据呈现的视图控制器的视图大小显示之前计算frameOfPresentedViewInContainerView
  • 呈现的视图控制器由固定高度的外部(导航)视图控制器组成,嵌入了一些动态高度的内部(内容)视图控制器;
  • 底层的内部视图控制器包含一个包装在UIScrollView中的UIStackView
  • 在计算内部视图控制器的大小之前,我会在其上调用layoutIfNeeded()

问题仅出现在带有刘海的设备上(我怪罪safeAreaLayout),并且仅适用于基于UIStackView的内部视图控制器。当在呈现的控制器上调用layoutIfNeeded()时(例如,当显示方向更改、内容大小更改或第二次呈现时),UIKitCore进入无限循环调用-[UIView layoutGuides]。它不会使应用程序崩溃,但会使用主线程的100%并冻结UI(有时整个手机到需要硬重置的程度),每秒消耗约10Mb的内存。

我通过在计算的frameOfPresentedViewInContainerView高度上添加1个额外点来修复它。这听起来像是一个可怕的解决方法,所以我正在尝试更好地了解问题。
如果有深入理解UIKit的人能指导我如何更好地调试/调查此问题,我将不胜感激。

更新

看起来UIScrollView由于安全区域而难以定位内容。UIKitCore不断重复这5行:

- [UIScrollView _layoutGuideOfType:createIfNecessary:]
- [NSISEngine(_UILayoutEngineStatistics)_UIKitPerformPendingChangeNotifications]
- [UIView layoutGuides]
- [_UIScrollViewScrollIndicator _layoutFillViewAnimated:]
- [UIView(AdditionalLayoutSupport) nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:onBehalfOfLayoutGuide:]

我也有

runtime: Layout Issues: Scrollable content size is ambiguous for UIScrollView.

我不确定你的代码是否有这个问题,但是当我将一个来自滚动视图的子视图控制器添加到承载滚动视图的视图控制器时,我遇到了类似的问题。问题出在我忘记添加子视图控制器(addChild() 然后 didMove(...))。 - vfn
你所说的"UIKitCore"是什么意思?苹果中没有一个名为"UIKitCore"的框架组件。你可能是指的UIKit。 - user3335999
1个回答

2

我通过将UIScrollView特定地附加到safeAreaLayoutGuide的底部来解决了我的问题。

var bottomConstraint = formView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
if #available(iOS 11.0, *) {
    bottomConstraint = formView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
}

你是人类中的神明。谢谢! - ullstrm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接