UITableViewHeaderFooterView с содержимым SwiftUI, автоматически получающим c вставку безопасной области - PullRequest
0 голосов
/ 02 мая 2020

У меня есть основа c UITableView с некоторыми ячейками. Я использую SwiftUI View как контент для своих ячеек и заголовков разделов. Как ни странно, только заголовок раздела, который появляется в нижней части экрана на iPhone XS Max, кажется, получает rawSafeAreaInset из 16 пунктов (проверено Иерархия просмотра отладки). Ячейки работают, как и ожидалось.

Чтобы увидеть, что происходит, я добавил фиктивный синий прямоугольник SwiftUI к contentView, а затем поместил красный UIView сверху, для обоих представлений установлены одинаковые ограничения. UITableView был настроен на использование автоматических размеров c для заголовков и ячеек.

public class SectionHeader: UITableViewHeaderFooterView {
  public static let reusableIdentifier = "Section"

  private var innerHostedViewController: UIHostingController<AnyView>!

  public override init(reuseIdentifier: String?) {
    super.init(reuseIdentifier: reuseIdentifier)

    setupHeader()
  }

  required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  private func setupHeader() {
    self.backgroundView = UIView()
    self.backgroundView?.backgroundColor = UIColor.green.withAlphaComponent(0.2)

    innerHostedViewController = UIHostingController(rootView: AnyView(Rectangle().fill(Color.blue).frame(height: 48)))
    innerHostedViewController.view.translatesAutoresizingMaskIntoConstraints = false
    innerHostedViewController.view.frame = self.contentView.bounds
    contentView.addSubview(innerHostedViewController.view)
    innerHostedViewController.view.backgroundColor = .clear

    let vv = UIView()
    vv.translatesAutoresizingMaskIntoConstraints = false
    vv.backgroundColor = .red
    contentView.addSubview(vv)

    NSLayoutConstraint.activate([
      vv.topAnchor.constraint(equalTo: self.contentView.topAnchor),
      vv.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor),
      vv.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor),
      vv.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor),

      innerHostedViewController.view.topAnchor.constraint(equalTo: self.contentView.topAnchor),
      innerHostedViewController.view.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor),
      innerHostedViewController.view.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor),
      innerHostedViewController.view.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor),
    ])
  }
}

Как видно на рисунке ниже, красный верхний слой виден для двух верхних заголовков (с пустыми ячейками для демонстрации), но последний на экране имеет синий прямоугольник SwiftUI, смещенный вверх !

enter image description here

Похоже, что это представление SwiftUI каким-то образом получает некоторый набор safeAreaInset, и, кажется, нет способа его отключить. Вставка также не удаляется go при прокрутке вверх. Он остается там навсегда. Я попытался отключить вставки безопасной области для представления SwiftUI, но это тоже не помогает:

innerHostedViewController = UIHostingController(rootView: AnyView(Rectangle().fill(Color.blue).frame(height: 48).edgesIgnoringSafeArea(.all)))

Как избавиться от этой вставки? Как я уже говорил, это происходит только с UITableViewHeaderFooterView с, а не с UITableViewCell с.

Иерархия представления отладки показывает фиктивный модификатор нижнего отступа, основанный на вставках безопасной области:

enter image description here

...