这是使用Xcode12为iOS14和macOS11设置iPhone、iPad和mac应用程序的
Apple Fruta app示例。使用此SwiftUI实现,您将拥有iPad和mac使用的分割视图。关于iPhone,您将获得经典的选项卡栏。这是一个可直接使用的代码,如果您不需要mac应用程序,请删除
#else
和
#end
之间的部分。我实现它是因为其他人可能会觉得它很方便,因为它非常适合多平台应用项目。位于
#if os(iOS)
和
#else
之间的代码适用于iPhone和iPad。请查看我在代码中添加的注释,解释了何时创建分割视图。ContentView包含根据设备类型进行导航的内容。
struct ContentView: View {
#if os(iOS)
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
#endif
@ViewBuilder
var body: some View {
#if os(iOS)
if horizontalSizeClass == .compact {
TabBarNavigationView()
}
else {
SidebarNavigationView()
}
#else
SidebarNavigationView()
.frame(minWidth: 900, maxWidth: .infinity, minHeight: 500, maxHeight: .infinity)
#endif
}
}
然后,使用枚举声明经典的 iPhone 标签栏,包含你的标签
(HomeView 可以替换为任何 SwiftUI 视图):
enum TabItem {
case home
}
struct TabBarNavigationView: View {
@State private var selection: TabItem = .home
var body: some View {
TabView(selection: $selection) {
NavigationView {
HomeView()
}
.tabItem {
Image(systemName: "house")
.font(.headline)
.imageScale(.medium) }
.tag(TabItem.home)
}
}
}
这是用于容纳iPad和mac经典分屏视图的视图。当iPad处于竖屏模式时,您的视图将作为导航,而在横屏模式下添加时,则会分屏。
struct SidebarNavigationView: View {
@SceneStorage("selection")
var selection: String?
var content: some View {
List(selection: $selection) {
NavigationLink(destination: HomeView()) {
Label(title: { Text("Home") },
icon: { Image(systemName: "house")
.font(.headline)
.imageScale(.medium) })
}
.tag(NavigationItem.home)
}
.listStyle(SidebarListStyle())
}
var body: some View {
NavigationView {
#if os(iOS)
content
#else
content
.frame(minWidth: 200, idealWidth: 200, maxWidth: 200, maxHeight: .infinity)
.toolbar {
ToolbarItem(placement: .navigation) {
Button(action: toggleSidebar ) {
Image(systemName: "sidebar.left")
.foregroundColor(.blue)
}
}
}
#endif
Text("Content List")
.frame(maxWidth: .infinity, maxHeight: .infinity)
#if os(iOS)
Text("Split view for iPad")
.frame(maxWidth: .infinity, maxHeight: .infinity)
#else
Text("Split view for macOS")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.toolbar { Spacer() }
#endif
}
}
}
extension SidebarNavigationView {
func toggleSidebar() {
#if os(macOS)
NSApp
.keyWindow?
.firstResponder?
.tryToPerform(#selector(NSSplitViewController.toggleSidebar(_:)),
with: nil)
#endif
}
}