如何使用 SwiftUI 摆脱嵌套 NavigationView 中的 space
How to get rid of space in nested NavigationView with SwiftUI
我目前正在使用 SwiftUI 为 iOS 开发一个项目。我有 3 个页面(MainMenu、CalendarList 和 DateDetails。)
在第 2 页 (CalenderList) 上,屏幕顶部和实际的 NavigationBarTitle 之间有一个空白 space。
在第三页,你可以看到后退按钮(到主菜单)和顶部有两个空的space。
我见过有人使用 .navigationBarHidden 来解决这个问题,但我无法以解决问题的方式实施它。
我是否错误地使用了 NavigationView()?还是有什么特别的技巧?
这是主菜单的代码:
import SwiftUI
struct MainMenu: View {
var body: some View {
NavigationView {
VStack {
Text("Calendar")
.font(.largeTitle)
.fontWeight(.heavy)
.foregroundColor(Color(red: 0.055, green: 0.173, blue: 0.322))
.padding(.top, 55.0)
Text("Main Menu")
.font(.headline)
.foregroundColor(Color(red: 0.635, green: 0.635, blue: 0.635, opacity: 1.0))
/*Image("Logo")
.resizable()
.frame(width: 150.0, height: 150.0)*/
Spacer()
HStack {
NavigationLink(destination: CalendarList()) {
Image(systemName: "calendar")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
NavigationLink(destination: CalendarList()) {
Image(systemName: "gear")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
}
HStack {
NavigationLink(destination: StudentInfo()) {
Image(systemName: "info.circle")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
NavigationLink(destination: CalendarList()) {
Image(systemName: "exclamationmark.circle")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
}
Spacer()
}
}
}
}
这是 CalendarList(第 2 页)的代码:
import SwiftUI
struct CalendarList: View {
var body: some View {
NavigationView {
List(calendarData, id: \.date) { Calendar in
if Calendar.collab {
NavigationLink(destination: DateDetails(calendar: Calendar)) {
CalendarRow(calendar: Calendar)
}
} else {
CalendarRow(calendar: Calendar)
}
}
.navigationBarTitle(Text("Schedule"))
}
}
}
这是 DateDetails(第 3 页)的代码:
import SwiftUI
struct DateDetails: View {
var calendar: Calendar
var body: some View {
NavigationView {
VStack (alignment: .center) {
//Image("Logo")
HStack {
Text(calendar.month.prefix(4) + ".")
.font(.largeTitle)
Text(String(calendar.date).suffix(1))
.font(.largeTitle)
Spacer()
}
HStack {
Text(calendar.schedule)
.font(.title)
Spacer()
}
Spacer()
.frame(height: 30.0)
Text(calendar.info)
.font(.body)
Spacer()
}
.navigationBarTitle(String(calendar.date).prefix(4).suffix(2) + "/" + String(calendar.date).suffix(2))
.padding()
}
}
}
仅在顶层使用 NavigationView,无需在每个子屏幕中都添加它,只需将其从 CalendarList 和 DateDetails 中移除即可解决间距问题
我认为你可以删除 DateDetails 的 NavigationView。
如果要更改导航栏,您可能需要编辑 navigationBarItems 或将 navigationBarHidden 更改为 true 并对其进行自定义。
https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-bar-items-to-a-navigation-view
我目前正在使用 SwiftUI 为 iOS 开发一个项目。我有 3 个页面(MainMenu、CalendarList 和 DateDetails。)
在第 2 页 (CalenderList) 上,屏幕顶部和实际的 NavigationBarTitle 之间有一个空白 space。
在第三页,你可以看到后退按钮(到主菜单)和顶部有两个空的space。
我见过有人使用 .navigationBarHidden 来解决这个问题,但我无法以解决问题的方式实施它。
我是否错误地使用了 NavigationView()?还是有什么特别的技巧?
这是主菜单的代码:
import SwiftUI
struct MainMenu: View {
var body: some View {
NavigationView {
VStack {
Text("Calendar")
.font(.largeTitle)
.fontWeight(.heavy)
.foregroundColor(Color(red: 0.055, green: 0.173, blue: 0.322))
.padding(.top, 55.0)
Text("Main Menu")
.font(.headline)
.foregroundColor(Color(red: 0.635, green: 0.635, blue: 0.635, opacity: 1.0))
/*Image("Logo")
.resizable()
.frame(width: 150.0, height: 150.0)*/
Spacer()
HStack {
NavigationLink(destination: CalendarList()) {
Image(systemName: "calendar")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
NavigationLink(destination: CalendarList()) {
Image(systemName: "gear")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
}
HStack {
NavigationLink(destination: StudentInfo()) {
Image(systemName: "info.circle")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
NavigationLink(destination: CalendarList()) {
Image(systemName: "exclamationmark.circle")
.resizable()
.frame(width: 75.0, height: 75.0)
.padding()
}
}
Spacer()
}
}
}
}
这是 CalendarList(第 2 页)的代码:
import SwiftUI
struct CalendarList: View {
var body: some View {
NavigationView {
List(calendarData, id: \.date) { Calendar in
if Calendar.collab {
NavigationLink(destination: DateDetails(calendar: Calendar)) {
CalendarRow(calendar: Calendar)
}
} else {
CalendarRow(calendar: Calendar)
}
}
.navigationBarTitle(Text("Schedule"))
}
}
}
这是 DateDetails(第 3 页)的代码:
import SwiftUI
struct DateDetails: View {
var calendar: Calendar
var body: some View {
NavigationView {
VStack (alignment: .center) {
//Image("Logo")
HStack {
Text(calendar.month.prefix(4) + ".")
.font(.largeTitle)
Text(String(calendar.date).suffix(1))
.font(.largeTitle)
Spacer()
}
HStack {
Text(calendar.schedule)
.font(.title)
Spacer()
}
Spacer()
.frame(height: 30.0)
Text(calendar.info)
.font(.body)
Spacer()
}
.navigationBarTitle(String(calendar.date).prefix(4).suffix(2) + "/" + String(calendar.date).suffix(2))
.padding()
}
}
}
仅在顶层使用 NavigationView,无需在每个子屏幕中都添加它,只需将其从 CalendarList 和 DateDetails 中移除即可解决间距问题
我认为你可以删除 DateDetails 的 NavigationView。
如果要更改导航栏,您可能需要编辑 navigationBarItems 或将 navigationBarHidden 更改为 true 并对其进行自定义。
https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-bar-items-to-a-navigation-view