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

pjngdqdw  于 2023-02-21  发布在  Swift
关注(0)|答案(2)|浏览(265)

我是Swift的新手,我一直在尝试开发一个应用程序,边开发边学习。我有一个NavigationView,它将List作为侧边栏,在用户点击时呈现内容。用户可以抓取这两个窗格之间的栏来调整大小。这似乎是NavigationView的默认行为。我正在试图找到一种方法来禁用它,因为我不希望用户调整侧边栏的大小。

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

我也找不到一种方法来告诉Swift我希望我的List视图有一个适合内容的动态宽度,就像CSSwidth: fit-content;一样
在下面的图片中,你可以看到我可以将侧边栏的大小调整到屏幕的一半。如何禁用这个行为?

gpfsuwkq

gpfsuwkq1#

我确实找到了一个解决方案,你所要做的就是设置目标宽度,这样侧边栏就不能调整到目标视图的大小,例如##考虑将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()
}
}

35g0bw71

35g0bw712#

我能够以一种奇怪的方式做到这一点,第一件事是创建一个NSViewControllerRepresentable,这样我就能够 Package 一个NSViewController,在其中生成一个1X1方形视图,因为NSViewController具有完整的生命周期,我能够在viewDidDisappere()中编写代码并切换回侧边栏

相关问题