跳到主要内容

让 SwiftUI 工具栏支持自定义

· 阅读需 3 分钟
GoSwiftUI
goswiftui.com

在 SwiftUI 中,让工具栏支持自定义意味着允许使用你应用的人添加、移除和移动工具栏项目。本文介绍创建可自定义工具栏需要设置的 ID、如何提取工具栏内容,以及如何加入系统工具栏菜单命令。

这里的“可自定义”是指让使用你应用的人可以添加、移除和移动工具栏项目。在 SwiftUI 应用中创建可自定义工具栏,需要完成以下两件事:

  • .toolbar 修饰符设置一个 ID
  • 给每个工具栏项目设置一个 ID

下面的代码在一个可自定义工具栏中创建工具栏项目,用于将版本控制变更推送到远程仓库,或从远程仓库拉取变更:

.toolbar(id: "mainToolbar") {
ToolbarItem(id: "push") {
Button(
action: {
// Push the changes
},
label: {
Label("Push", systemImage: "square.and.arrow.up")
}
).accessibilityLabel("Push Changes")
}

ToolbarItem(id: "pull") {
Button(
action: {
// Pull the changes
},
label: {
Label("Pull", systemImage: "square.and.arrow.down")
}
).accessibilityLabel("Pull Changes")
}
}

.toolbar 修饰符之外创建工具栏项目

如果工具栏包含很多项目,将创建工具栏项目的代码移出 .toolbar 修饰符,可以让工具栏代码更清晰。如果工具栏创建代码位于 .toolbar 修饰符之外,那么变量或函数必须遵循 CustomizableToolbarContent 协议,工具栏才能支持自定义。

下面的代码将工具栏项目创建代码放到一个独立变量中:

@ToolbarContentBuilder
private var toolbarContent: some CustomizableToolbarContent {
ToolbarItem(id: "push") {
Button(
action: {
// Push the changes
},
label: {
Label("Push", systemImage: "square.and.arrow.up")
}
).accessibilityLabel("Push Changes")
}

ToolbarItem(id: "pull") {
Button(
action: {
// Pull the changes
},
label: {
Label("Pull", systemImage: "square.and.arrow.down")
}
).accessibilityLabel("Pull Changes")
}

}

.toolbar(id: "mainToolbar") {
toolbarContent
}

工具栏项目组

SwiftUI 包含一个 ToolbarItemGroup 结构体,它允许你创建一组工具栏项目,而不需要把每个项目都包在 ToolbarItem 块中。遗憾的是,ToolbarItemGroup 不遵循 CustomizableToolbarContent,因此不能在可自定义工具栏中使用 ToolbarItemGroup。你必须使用 ToolbarItem 来创建工具栏项目。

将工具栏相关菜单项添加到“显示”菜单

你可以在 App 结构体的 .commands 修饰符中加入 ToolbarCommands 结构体,从而向“显示”菜单添加用于隐藏/显示工具栏以及自定义工具栏的菜单项。

.commands {
ToolbarCommands()
}

原文地址:https://swiftdevjournal.com/posts/make-swiftui-toolbar-customizable