SwiftUI的大标题导航栏与UIViewControllerRepresentable UITableViewController的兼容性
Compatibility between SwiftUI's large title navigation bar and UIViewControllerRepresentable UITableViewController
为了在 SwiftUI 列表中实现向右滑动,我正在尝试制作 UIViewControllerRepresentable UITableViewController.
但是不兼容displayMode为.large时的导航栏。
我猜,当滚动条移动时,应该
- 调整导航栏的大小。
- 调整滚动视图或列表的框架。
#2 不适用于我的 table 视图,因此需要做一些事情。
我需要你的帮助。
[图片]
- 第一次渲染效果很好。
- 滚动后,在 table 视图上方有额外的 space
- 点击显示屏顶部 scroll-to-top 后,位置被破坏。
- 滚动后的视图层次结构(在第一次渲染后修复)
[代码]重现(从[=43=创建swiftui项目后,替换内容
ContentView.swift 与下面的代码。)
import SwiftUI
final class TableViewWrapper: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UITableViewController {
let viewController = UITableViewController()
viewController.tableView.delegate = context.coordinator
viewController.tableView.dataSource = context.coordinator
return viewController
}
func updateUIViewController(_ uiViewController: UITableViewController, context: Context) {
uiViewController.tableView.reloadData()
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
class Coordinator: NSObject, UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
cell.backgroundColor = .black
cell.textLabel!.textColor = .white
cell.textLabel!.text = "Test"
return cell
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
TableViewWrapper()
.navigationBarTitle("Nav title", displayMode: .large)
}
}
}
我找到了解决方案。
TableViewWrapper()
.edgesIgnoringSafeArea(.top)
为了在 SwiftUI 列表中实现向右滑动,我正在尝试制作 UIViewControllerRepresentable UITableViewController.
但是不兼容displayMode为.large时的导航栏。
我猜,当滚动条移动时,应该
- 调整导航栏的大小。
- 调整滚动视图或列表的框架。
#2 不适用于我的 table 视图,因此需要做一些事情。 我需要你的帮助。
[图片]
- 第一次渲染效果很好。
- 滚动后,在 table 视图上方有额外的 space
- 点击显示屏顶部 scroll-to-top 后,位置被破坏。
- 滚动后的视图层次结构(在第一次渲染后修复)
[代码]重现(从[=43=创建swiftui项目后,替换内容 ContentView.swift 与下面的代码。)
import SwiftUI
final class TableViewWrapper: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UITableViewController {
let viewController = UITableViewController()
viewController.tableView.delegate = context.coordinator
viewController.tableView.dataSource = context.coordinator
return viewController
}
func updateUIViewController(_ uiViewController: UITableViewController, context: Context) {
uiViewController.tableView.reloadData()
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
class Coordinator: NSObject, UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
cell.backgroundColor = .black
cell.textLabel!.textColor = .white
cell.textLabel!.text = "Test"
return cell
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
TableViewWrapper()
.navigationBarTitle("Nav title", displayMode: .large)
}
}
}
我找到了解决方案。
TableViewWrapper()
.edgesIgnoringSafeArea(.top)