如何在SwiftUI(MacOS)中禁用侧栏NavigationView的可调整大小性?

8

我刚了解Swift,并一边学习一边试图构建一个应用程序。 我有一个NavigationView将列表作为侧边栏,当用户点击时呈现内容。这两个窗格之间的栏可以抓取以允许用户调整大小。 这似乎是NavigationView的默认行为。 我试图找到一种方法来禁用它,因为我不希望用户调整侧边栏的大小。

struct Sidebar: View {
    var body: some view {
        List {
            NavigationLink("First section", destination: FirstSection)
        }
        .frame(minWidth: 150, maxWidth: 150)
    }
}

我也找不到一种方法来告诉Swift,我希望我的列表视图具有适应内容的动态宽度,就像使用CSS width: fit-content;完成的那样。

在下面的图片中,您可以看到我成功地调整了侧边栏的大小,使其几乎占据了屏幕的一半。如何禁用这个行为?

enter image description here


1
同时,防止侧边栏完全折叠也是很有趣的。 - NilsBerni
2个回答

2
我找到了一个解决方案,只需设置目标宽度,这样侧边栏就无法调整到目标视图的大小,例如像这样 ## 将firstSection()视为视图 ##

这里是应用程序的主要启动

import SwiftUI

@main
struct macosTestApp: App {
var body: some Scene {
    WindowGroup {
        NavigationView {
            SideBar()
        }.toolbar {
            // add the open/close sidebar navigation here
            ToolbarItem(placement: .navigation) {
                Button(action: toggleSidebar, label: { // 1
                    Image(systemName: "sidebar.leading")
                })
            }
           
         
            
        }.frame(minWidth: 800, maxWidth: .infinity, minHeight: 600, maxHeight: .infinity, alignment: .center)
    }
}
private func toggleSidebar() { // 2
    NSApp.keyWindow?.firstResponder?.tryToPerform(#selector(NSSplitViewController.toggleSidebar(_:)), with: nil)
}

}

这里是侧边栏和导航视图。
import SwiftUI

struct SideBar: View {
@State var isActiveView:Bool = true
var body: some View {
    
    List {
        NavigationLink("First section", destination: FirstSection().frame(minWidth: 750, maxWidth: .infinity, minHeight: 600, maxHeight: .infinity, alignment: .center),isActive: $isActiveView)
    }
    
}

}

struct FirstSection: View {

var body: some View {
    
    Text("Hello")
}

}

struct text_Previews: PreviewProvider {
static var previews: some View {
    SideBar()
}
}

enter image description here


0
我用一种奇怪的方式做到了, 首先创建了一个NSViewControllerRepresentable 因此我能够包装一个NSViewController,其中我生成了一个1X1的正方形视图, 由于NSViewController具有完整的生命周期, 我能够在viewDidDisappear()内编写代码 并切换回侧边栏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接