Since the header of a List can't be customised as much as I'd like it to be, I've used a workaround with a ScrollView and a LazyVStack.
ScrollView {
LazyVStack(pinnedViews: .sectionHeaders) {
ForEach(...)
}
}
However, I can't seem to get the separators right or the amount of padding as well the the default separator insets.
I am making the separators with Divider() but even with dynamic type the views becomes 'broken'.
Is there a way to recreate a List with the standard appearance without using one?
Help is much appreciated.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
How can I show a default view when there's no selection like in a normal NavigationView but with a UINavigationController?
I've tried this
} content: {
NavigationView {
Text("Hello, World!")
.navigationTitle("Title")
Text("No selection")
}
.navigationBarHidden(true)
}
but then the search bar doesn't show.
struct SearchBarNavigationView<SearchResultsContent: View, Content: View>: UIViewControllerRepresentable {
class Coordinator: NSObject, UISearchResultsUpdating {
private let parent: SearchBarNavigationView
init(_ parent: SearchBarNavigationView) {
self.parent = parent
}
func updateSearchResults(for searchController: UISearchController) {
guard let searchText = searchController.searchBar.text else { return }
DispatchQueue.main.async { self.parent.text = searchText.trimmingCharacters(in: .whitespaces) }
}
}
@Binding private var text: String
private let searchResultsContent: SearchResultsContent
private let content: Content
init(text: Binding<String>, @ViewBuilder searchResultsContent: () -> SearchResultsContent, @ViewBuilder content: () -> Content) {
_text = text
self.searchResultsContent = searchResultsContent()
self.content = content()
}
func makeUIViewController(context: Context) -> UINavigationController {
let rootViewController = UIHostingController(rootView: content)
let navigationController = UINavigationController(rootViewController: rootViewController)
navigationController.navigationBar.prefersLargeTitles = true
let searchResultsController = UIHostingController(rootView: searchResultsContent)
let searchController = UISearchController(searchResultsController: searchResultsController)
searchController.searchResultsUpdater = context.coordinator
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.autocapitalizationType = .none
navigationController.navigationBar.topItem?.searchController = searchController
return navigationController
}
func updateUIViewController(_ uiViewController: UINavigationController, context: Context) {
if let searchResultsController = uiViewController.navigationBar.topItem?.searchController?.searchResultsController as? UIHostingController<SearchResultsContent> {
searchResultsController.rootView = searchResultsContent
searchResultsController.view.setNeedsDisplay()
}
if let rootViewController = uiViewController.topViewController as? UIHostingController<Content> {
rootViewController.rootView = content
rootViewController.view.setNeedsDisplay()
}
uiViewController.navigationBar.topItem?.searchController?.searchBar.text = text
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
}
SearchBarNavigationView(text: $searchText) {
Text(searchText)
} content: {
Text("Hello, World!")
.navigationTitle("Title")
Text("No selection") // make this show when no selection
}
.ignoresSafeArea()