У меня есть основа 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, смещенный вверх !
Похоже, что это представление SwiftUI каким-то образом получает некоторый набор safeAreaInset, и, кажется, нет способа его отключить. Вставка также не удаляется go при прокрутке вверх. Он остается там навсегда. Я попытался отключить вставки безопасной области для представления SwiftUI, но это тоже не помогает:
innerHostedViewController = UIHostingController(rootView: AnyView(Rectangle().fill(Color.blue).frame(height: 48).edgesIgnoringSafeArea(.all)))
Как избавиться от этой вставки? Как я уже говорил, это происходит только с UITableViewHeaderFooterView
с, а не с UITableViewCell
с.
Иерархия представления отладки показывает фиктивный модификатор нижнего отступа, основанный на вставках безопасной области: