如何排列 SwiftUI 工具栏项目?
How do I arrange SwiftUI Toolbar items?
我有一个带有 4 个按钮的 SwiftUI 工具栏,但是我实现的代码不正确,因为在模拟器中更改设备类型时按钮最终会出现在奇怪的地方。
更糟糕的是,在 iPhone 8 / 8 Plus 上查看时,其中 2 个按钮位于 window 的最边缘。
如何正确地将 spacing/padding 应用于工具栏按钮,以便它们在不同的 iOS 设备上保持一致?
谢谢!
// This code spaces the buttons but they change positions depending on the iOS device
ToolbarItem {
HStack {
HStack {
ProfileUploadMediaButton()
}.padding([.trailing], 85)
HStack {
ProfileUsernameButton()
}.padding([.trailing], 84)
HStack {
ProfileLiveButton()
}.padding([.trailing], 6)
HStack {
AccountButton()
}.padding([.trailing], 12)
}
}
})
// I was thinking code like this but all buttons are bunched together on the right-side of // the screen...
ToolbarItem {
HStack {
ProfileUploadMediaButton()
ProfileUsernameButton()
ProfileLiveButton()
AccountButton()
}
}
添加 ToolbarItems 时,有一个初始化程序,您可以在其中明确设置每个项目的位置。对于您的情况,您将为左侧、中心和右侧添加 3 个 ToolbarItems。我要提到的是工具栏是动态的,因此它在不同设备上的外观可能会有所不同。
struct ToolbarView: View {
var body: some View {
NavigationView {
VStack {
Text("Hello, world!")
}
.navigationTitle("Test")
.toolbar(content: {
ToolbarItem(placement: .navigationBarLeading) {
Image(systemName: "camera.fill")
}
ToolbarItem(placement: .principal) {
Text("Username")
}
ToolbarItem(placement: .navigationBarTrailing) {
HStack {
Image(systemName: "dot.radiowaves.left.and.right")
Image(systemName: "heart.fill")
}
}
})
}
}
}
根据文档,这里是放置选项。我猜想当您没有明确添加展示位置时,它们会默认为 .automatic。
自动:
该项目是自动放置的,具体取决于许多因素,包括平台、大小 class 或是否存在其他项目。
底部栏:
该项目位于底部工具栏中。适用于 iOS、iPadOS 和 Mac Catalyst。
取消操作:
该项目表示模态界面的取消操作。
确认操作:
该项目表示模态界面的确认操作。
破坏性动作:
该项目表示对模态界面的破坏性操作。
导航:
该项目表示导航操作。
navigationBarLeading:
该项目位于导航栏的前缘。适用于 iOS、iPadOS、tvOS 和 Mac Catalyst。
navigationBarTrailing:
该项目放置在导航栏的后缘。适用于 iOS、iPadOS、tvOS 和 Mac Catalyst。
主要动作:
该项目代表主要操作。
校长:
该项目放置在主要项目部分。
ToolbarItemPlacement:
该项目表示当前上下文的状态更改。
我有一个带有 4 个按钮的 SwiftUI 工具栏,但是我实现的代码不正确,因为在模拟器中更改设备类型时按钮最终会出现在奇怪的地方。
更糟糕的是,在 iPhone 8 / 8 Plus 上查看时,其中 2 个按钮位于 window 的最边缘。
如何正确地将 spacing/padding 应用于工具栏按钮,以便它们在不同的 iOS 设备上保持一致?
谢谢!
// This code spaces the buttons but they change positions depending on the iOS device
ToolbarItem {
HStack {
HStack {
ProfileUploadMediaButton()
}.padding([.trailing], 85)
HStack {
ProfileUsernameButton()
}.padding([.trailing], 84)
HStack {
ProfileLiveButton()
}.padding([.trailing], 6)
HStack {
AccountButton()
}.padding([.trailing], 12)
}
}
})
// I was thinking code like this but all buttons are bunched together on the right-side of // the screen...
ToolbarItem {
HStack {
ProfileUploadMediaButton()
ProfileUsernameButton()
ProfileLiveButton()
AccountButton()
}
}
添加 ToolbarItems 时,有一个初始化程序,您可以在其中明确设置每个项目的位置。对于您的情况,您将为左侧、中心和右侧添加 3 个 ToolbarItems。我要提到的是工具栏是动态的,因此它在不同设备上的外观可能会有所不同。
struct ToolbarView: View {
var body: some View {
NavigationView {
VStack {
Text("Hello, world!")
}
.navigationTitle("Test")
.toolbar(content: {
ToolbarItem(placement: .navigationBarLeading) {
Image(systemName: "camera.fill")
}
ToolbarItem(placement: .principal) {
Text("Username")
}
ToolbarItem(placement: .navigationBarTrailing) {
HStack {
Image(systemName: "dot.radiowaves.left.and.right")
Image(systemName: "heart.fill")
}
}
})
}
}
}
根据文档,这里是放置选项。我猜想当您没有明确添加展示位置时,它们会默认为 .automatic。
自动: 该项目是自动放置的,具体取决于许多因素,包括平台、大小 class 或是否存在其他项目。
底部栏: 该项目位于底部工具栏中。适用于 iOS、iPadOS 和 Mac Catalyst。
取消操作: 该项目表示模态界面的取消操作。
确认操作: 该项目表示模态界面的确认操作。
破坏性动作: 该项目表示对模态界面的破坏性操作。
导航: 该项目表示导航操作。
navigationBarLeading: 该项目位于导航栏的前缘。适用于 iOS、iPadOS、tvOS 和 Mac Catalyst。
navigationBarTrailing: 该项目放置在导航栏的后缘。适用于 iOS、iPadOS、tvOS 和 Mac Catalyst。
主要动作: 该项目代表主要操作。
校长: 该项目放置在主要项目部分。
ToolbarItemPlacement: 该项目表示当前上下文的状态更改。