Post

Replies

Boosts

Views

Activity

Custom list with LazyVStack
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.
0
0
1.3k
Dec ’20
Show default detail screen in UINavigationController
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()
1
0
831
Dec ’20