【问题标题】:SwiftUI macOS toolbar icons alignment for three column layout三列布局的 SwiftUI macOS 工具栏图标对齐
【发布时间】:2021-05-16 00:20:41
【问题描述】:

在这个问题之后,how to add a toolbar divider for a three column view in swiftUI life cycle ,我有一个稍微不同的问题。我正在尝试实现相同的目标,但第二列和第三列包含在一个视图中,该视图又添加到导航视图中,靠近第一列,即侧边栏。

代码示例

import SwiftUI

@main
struct ThreeColumnsAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .frame(minWidth: 900, maxWidth: .infinity, minHeight: 600, maxHeight: .infinity)
        }
        .windowStyle(DefaultWindowStyle())
        .windowToolbarStyle(UnifiedWindowToolbarStyle(showsTitle: true))
    }
}

struct ContentView: View {
    var body: some View {
        
        NavigationView {
            Sidebar()
                .toolbar { Button(action: {}, label: { Image(systemName: "sidebar.left") }) }
            MainContentView()
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}

struct Sidebar: View {
    
    var body: some View {
        List {
            Text("Menu 1")
            Text("Menu 2")
            Text("Menu 3")
            Text("Menu 4")
        }
        .frame(minWidth: 250)
        .listStyle(SidebarListStyle())
    }
}

struct MainContentView: View {
    
    var body: some View {
        
        NavigationView {
            ListItemView()
            DetailView()
        }
        .navigationTitle("Items List")
        .navigationSubtitle("5 items found")
    }
}

struct ListItemView: View {
    
    var body: some View {
        
        List {
            Text("List item 1")
            Text("List item 2")
            Text("List item 3")
            Text("List item 4")
            Text("List item 5")
        }
        .frame(minWidth: 250)
        .listStyle(InsetListStyle())
        .toolbar {
            Button(action: {}, label: { Image(systemName: "arrow.up.arrow.down.square") })
        }
    }
}

struct DetailView: View {
    
    var body: some View {
        Text("Detail of list 1")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .toolbar {
                Button(action: {}, label: { Image(systemName: "plus") })
                Button(action: {}, label: { Image(systemName: "minus") })
                Button(action: {}, label: { Image(systemName: "pencil") })
            }
    }
}

输出

如下所示,应该在第二列的工具栏上的箭头图标与详细视图的工具栏图标一起被推到右侧。似乎 NavigationView 将 ListItemView 和 DetailView 工具栏视为一个工具栏。

期望的输出

问题

那么,我的问题是如何让工具栏图标与他们的视图对齐?

【问题讨论】:

    标签: macos swiftui toolbar swiftui-navigationview


    【解决方案1】:

    为了正确执行此操作,您需要在视图的三列中的每一列上都有一个ToolbarItem。例如,这个:

    struct TripleNavView: View {
        
        var body: some View {
            NavigationView {
                
                Text("Column 1")
                    .toolbar {
                        ToolbarItem {
                            Button(action: {}, label: {Image(systemName: "sidebar.left")})
                        }
                    }
                Text("Column 2")
                    .toolbar {
                        ToolbarItem {
                            Button(action: {}, label: {Image(systemName: "plus")})
                        }
                    }
                Text("Column 3")
                    .toolbar {
                        ToolbarItem {
                            Button(action: {}, label: {Image(systemName: "trash")})
                        }
                    }
            }
            .navigationTitle("Title")
        }
    }
    

    产生这个:

    重要的是 第 2 列和第 3 列都需要有某种ToolbarItem。如果你只在其中一列上放置一个按钮,那么 SwiftUI 会将它一直放在工具栏的后沿,并破坏外观。

    因此,如果您不想在特定列上使用按钮,请用 Spacer 代替按钮。

    请注意,将其留空或使用 EmptyView() 将不起作用 - SwiftUI 会对其进行优化,并表现得好像您一开始就没有包含 ToolbarItem

    【讨论】:

    • 感谢您的回答。我还发现 NavigationView 需要在编译时知道列数。在我的示例中,NavigationView 有 2 列,Sidebar 和 MainContentView,而 ListItemView 和 DetailView 包含在 MainContentView 中。因此,在编译时 NavigationView 只看到两列并相应地放置工具栏项。
    猜你喜欢
    • 2015-09-30
    • 2016-11-30
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多