如何在带有SwiftUI的.fullSizeContent窗口中拥有功能齐全的NavigationView
我正试图让我的如何在带有SwiftUI的.fullSizeContent窗口中拥有功能齐全的NavigationView,swift,swiftui,macos-catalina,navigationview,arrow-keys,Swift,Swiftui,Macos Catalina,Navigationview,Arrow Keys,我正试图让我的导航视图填满整个窗口。列表应该从窗口的上边缘延伸到下边缘。但是,虽然在的样式掩码中添加了.fullSizeContentView后,列表一开始看起来是正确的,但只要我选择一个列表项,整个导航视图就会缩小 为了防止缩水,我找到了两个选择 将ZStack与Color-背景一起使用,这样背景将调整DetailView的大小 使用frame-修饰符,使maxWidth和maxHeight为.infinity 但这两个选项都会破坏列表的箭头键导航 使用NavigationView设置全尺寸内
导航视图
填满整个窗口。列表
应该从窗口的上边缘延伸到下边缘。但是,虽然在的样式掩码中添加了.fullSizeContentView
后,列表一开始看起来是正确的,但只要我选择一个列表项,整个导航视图就会缩小
为了防止缩水,我找到了两个选择
将ZStack
与Color
-背景一起使用,这样背景将调整DetailView
的大小
使用frame
-修饰符,使maxWidth
和maxHeight
为.infinity
但这两个选项都会破坏列表的箭头键导航
使用NavigationView
设置全尺寸内容的正确方法是什么
下面是复制问题所需的完整工作示例代码。如果您想测试它,只需在Catalina上的全新Swift macOS应用程序中替换这些文件的内容即可
AppDelegate.swift
导入可可粉
导入快捷键
@非应用程序主
类AppDelegate:NSObject,NSApplicationDelegate{
变量窗口:NSWindow!
func ApplicationIDFinishLaunching(通知:通知){
让contentView=contentView()
window=NSWindow(
contentRect:NSRect(x:0,y:0,宽度:480,高度:300),
样式掩码:[.标题、.closable、.Minimable、.Resize、.fullSizeContentView],
//据我所知,这里是一种方式(使用Xcode 12/macOS 10.15.6进行测试)。上面的WarneView
没有任何更改
谢谢你的回答。但是我猜这是在AppDeaveT.SWIFT中漏掉了.FulsisiZeCon视图。所以隐藏的标题栏是可见的。在缺少.FulsisiZeCeNeTunVIEW——不,。FulsisiZeCon视图> /代码>。如果你想隐藏标题栏是不同的问题,请考虑。我想这不是一个不同的问题,因为我问:我正在尝试让NavigationView填满整个窗口。列表应该从窗口的上边缘延伸到下边缘。
我设置了.edgesIgnoringSafeArea(.all)
正如您在通过链接看到的答案中建议的那样。只有我在ContentView.swift中设置了它,而不是在AppDelegate中。将其移到AppDelegate似乎对问题没有任何影响。无法使用箭头键导航列表。
import Cocoa
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
func applicationDidFinishLaunching(_ aNotification: Notification) {
let contentView = ContentView()
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
// <---- remove .fullSizeContentView mask and layout will work without option 1 or 2 in ContentView
backing: .buffered, defer: false)
window.titlebarAppearsTransparent = true
window.titleVisibility = .hidden
window.isReleasedWhenClosed = false
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
}
}
import SwiftUI
let warners = ["Yacko","Wacko","Dot"]
struct WarnerView: View {
var name: String
var body: some View {
// ZStack { // <---- Option 1: use ZStack with Color.clear
// Color.clear
VStack {
Text(name)
Text("Nothing to see here!")
}
// .frame(minWidth: 100, idealWidth: 100, maxWidth: .infinity, minHeight: 100, idealHeight: 100, maxHeight: .infinity, alignment: .center)
// <---- Option 2: use only VStack with frame
// } // <- closing bracket for ZStack
}
}
struct ContentView: View {
var body: some View {
ZStack {
Color.clear
NavigationView {
VStack(alignment: .leading) {
HStack {
Text("Warners")
.font(.headline)
}
.padding(16)
List(warners, id: \.self)
{ warner in
NavigationLink(destination: WarnerView(name: warner)
) {
Text(warner)
}
}.listStyle(SidebarListStyle())
}
}
}
.edgesIgnoringSafeArea(.all)
.frame(minWidth: 600, minHeight: 400)
}
}
struct ContentView: View {
var body: some View {
NavigationView {
List {
HStack {
Text("Warners")
.font(.headline)
}
ForEach(warners, id: \.self)
{ warner in
NavigationLink(destination:
WarnerView(name: warner)
.frame(maxWidth: .infinity, maxHeight: .infinity)
) {
Text(warner)
}
}
}.listStyle(SidebarListStyle())
// uncomment below for default details area
// WarnerView(name: "")
// .frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
}