UIKitCore layoutGuides тупик - PullRequest
       56

UIKitCore layoutGuides тупик

1 голос
/ 10 февраля 2020

Я создаю всплывающее меню. Он имеет 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.

1 Ответ

0 голосов
/ 11 февраля 2020

Мне удалось устранить проблему, специально прикрепив UIScrollView к нижней части safeAreaLayoutGuide.

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