我正在创建一个弹出菜单。它有一个
如果有深入理解UIKit的人能指导我如何更好地调试/调查此问题,我将不胜感激。
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.