swift - 如何使用 SwiftUI 在 .fullSizeContent 窗口中拥有功能齐全的 NavigationView
问题描述
我试图让我NavigationView
填满整个窗口。List
应该从其窗口的顶部边缘延伸到底部边缘。但是,虽然 List 起初看起来是正确的,但.fullSizeContentView
只要NSWindow
我styleMask
选择了一个列表项,整个 NavigationView 就会缩小。
为了防止收缩,我找到了两个选择。
- 使用
ZStack
带有Color
-background 的 a,因此背景将调整大小DetailView
。 - 使用
frame
-modifier withmaxWidth
andmaxHeight
being.infinity
这两个选项都会破坏List
' 的箭头键导航。
使用 设置全尺寸内容的正确方法是NavigationView
什么?
下面是复制问题所需的完整工作示例代码。如果你想测试它,只需在 Catalina 上的新 Swift macOS 应用程序中替换这些文件的内容。
AppDelegate.swift
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)
}
}
内容视图.swift
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)
}
}
解决方案
据我了解,这是一种方式(使用 Xcode 12 / macOS 10.15.6 测试)。对您的上述内容没有任何更改WarnerView
。
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)
}
}
}
推荐阅读
- google-bigquery - 在 Google BigQuery 和 SQL 标准中创建漏斗
- environment-variables - 检测 babel.config.js 中类似于 react-native 的 __DEV__ 的开发环境
- php - 公司的搜索请求返回所有公司,而不是 HubSpot API 中的一个按域
- c# - 从 Webview 导航到 xamarin 表单中的应用程序页面
- excel - 如何使用 sumproduct 总结以前的单元格?
- elastic-stack - 如何使用摄取管道(弹性堆栈)中的条件添加自定义字段?
- material-ui - 自定义内联单元格验证
- python - 如何将数据插入默认图形名称?
- c# - Aspose.PDF - 将带有内联 SVG 的 HTML 转换为 PDF 时出现“参数无效”
- reactjs - Webpack 开发服务器在热重载时重置状态