SwiftUI — слишком много места между строкой поиска и заголовком навигации.IOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI — слишком много места между строкой поиска и заголовком навигации.

Сообщение Anonymous »

Я работаю над сложным приложением со слишком большим количеством кода, но я попытался создать образец приложения с необходимым работающим кодом, чтобы объяснить мою проблему.
Допустим, у меня есть контент представление с помощью кнопки, которая открывает модальное окно/лист (с именем «Основной вид») с заголовком навигации, панелью поиска и кнопкой. В этом основном представлении строка поиска и заголовок навигации расположены правильно. Когда я нажимаю кнопку с основным видом, он переходит к другому представлению (названному «Подпредставление»), которое имеет панель поиска, заголовок навигации и, в конечном итоге, будет иметь кнопку «Назад» для возврата к основному представлению. В этом дополнительном представлении я вижу, что заголовок навигации и панель поиска расположены неправильно, т. е. между заголовком навигации и панелью поиска много места.
Не могу выяснить причину это и как это исправить... есть какие-нибудь идеи или мысли по этому поводу? Это из-за двух стеков навигации, то есть одного в структуре SampleAppApp, а другого в структуре MainView?
Код:

Код: Выделить всё

import SwiftUI
import Foundation
import Combine

@main
struct SampleAppApp: App {
var body: some Scene {
WindowGroup {
NavigationStack {
ContentView()
}
}
}
}

struct ContentView: View {
@State private var showModal: Bool = false
var body: some View {
VStack {
Button("Click ME", action: { self.showModal.toggle() })
}
.sheet(isPresented: $showModal) {
ZStack {
Color(red: 0.95, green: 0.95, blue: 0.97)
MainView(isPresented: $showModal).padding(.top, 15.0)
}
}
}
}

// MARK: Code for Main View after "Click ME" is clicked
struct MainView: View {
@State private var searchText = ""
let searchTextPublisher = PassthroughSubject()

/// Set to true when the panel is displayed. Dismisses the panel when set to false.
var isPresented: Binding
@State private var showSubView: Bool = false

var body: some View {
NavigationStack {
ZStack {
Color(red: 0.95, green: 0.95, blue: 0.97).edgesIgnoringSafeArea(.all)
VStack {
VStack {
Button("Tap to open sub-view", action: {
self.showSubView.toggle()
}).padding(.top, 20.0)
}
.navigationDestination(isPresented: $showSubView) {
SubView()
}

MainViewSearchResultListAndNavTitle()
.searchable(
text: $searchText,
placement: .navigationBarDrawer(displayMode: .always),
prompt: "search"
)
.onChange(of: searchText) { newText in
searchTextPublisher.send(newText) /// Publishes when a search term is changed. This is used to debounce the search.
}
Spacer()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(red: 0.95, green: 0.95, blue: 0.97))
}
}
.presentationDetents([.large])
.interactiveDismissDisabled(true)
.presentationBackgroundInteraction(.enabled)
}
}

/// Shows search bar and search results list.
struct MainViewSearchResultListAndNavTitle: View {
var body: some View {
VStack {
// Contains search results list
}
.toolbar(content: {
ToolbarItem(placement: .navigationBarLeading) {
Text("Main View")
.bold()
.font(.largeTitle)
.padding(.bottom, 15.0)
}
})
.toolbarBackground(Color(red: 0.95, green: 0.95, blue: 0.97), for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
}
}

// MARK: Code for Sub View after "Tap to open sub-view" is clicked. This view will have back button to go back to 2nd view i.e.  "Main View".
struct SubView: View {
var body: some View {
ZStack {
Color(red: 0.95, green: 0.95, blue: 0.97).edgesIgnoringSafeArea(.all)
VStack {
SubViewSearchResultsListAndNavTitle()
.searchable(
text: .constant(""),
placement: .navigationBarDrawer(displayMode: .always),
prompt: "search"
)
Spacer()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(red: 0.95, green: 0.95, blue: 0.97))
}
}
}

private struct SubViewSearchResultsListAndNavTitle: View {
var body: some View {
VStack {
// Contains search results list for sub view.
}
.toolbar(content: {
ToolbarItem(placement: .principal) {
Text("Sub view").bold()
.font(.title)
.padding(.bottom, 15.0)
}
})
.toolbarBackground(Color(red: 0.95, green: 0.95, blue: 0.97), for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
.navigationBarBackButtonHidden(true)
}
}
Снимок экрана:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/770 ... tion-title
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»