Я создаю всплывающее меню. Он имеет UIPresentationController
, который вычисляет frameOfPresentedViewInContainerView
на основе размера представления представленного контроллера представления до его отображения.
- Представленные контроллеры вида состоят из контроллера внешнего (навигационного) вида фиксированной высоты, в который встроены некоторые динамические c контроллер вида внутреннего (контентного) уровня высоты;
- Контроллеры внутреннего вида под капотом , оберните
UIStackView
в UIScrollView
; - Перед вычислением размера контроллера внутреннего вида я звоню на него
layoutIfNeeded()
.
Проблема возникла только на устройствах с вырез (я виню safeAreaLayout) и только с внутренними контроллерами представления на основе UIStackView. Когда layoutIfNeeded()
вызывается на представленном контроллере (например, при изменении ориентации дисплея, изменении размера контента или во втором представлении) UIKitCore переходит в бесконечное l oop, вызывая -[UIView layoutGuides]
. Оно не создает sh приложения, но использует 100% основного потока и замораживает пользовательский интерфейс (иногда весь телефон до такой степени, что вам нужно сделать полный сброс), потребляя около 10 МБ памяти каждую секунду.
Мне удалось это исправить, добавив 1 дополнительную точку к расчетной высоте frameOfPresentedViewInContainerView
. Это звучит как ужасное решение, поэтому я пытаюсь лучше понять проблему.
Я был бы рад, если бы кто-то с глубоким пониманием UIKit мог указать мне на лучшую стратегию о том, как отладить / исследовать проблему .
ОБНОВЛЕНИЕ
Похоже на UIScrollView
с трудным позиционированием контента из-за safeArea. 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.