macOS SwiftUI,内容不填充没有标题栏的 NSWindow

Posted

技术标签:

【中文标题】macOS SwiftUI,内容不填充没有标题栏的 NSWindow【英文标题】:macOS SwiftUI, content does not fill NSWindow without titlebar 【发布时间】:2022-01-13 09:22:40 【问题描述】:

我正在尝试创建一个自定义 NSWindow,我希望我的内容完全填充可用空间,我设法隐藏导航栏按钮和标题并使其透明,但是当我设置内容以填充可用空间时space 底部有一些空间不工作

我创建窗口的方式:

  private func createWindow() -> MyWindow 
    let window = MyWindow(
      contentRect: NSRect(x: 0, y: 0, width: 10, height: 10), // these values don't matter, the window expands to the swiftUI view
      styleMask: [.titled, .closable, .fullSizeContentView],
      backing: .buffered, defer: false)
    
    window.titlebarAppearsTransparent = true
    window.titleVisibility = .hidden
    window.isMovableByWindowBackground = false
    window.isReleasedWhenClosed = false
    window.collectionBehavior = [.transient, .ignoresCycle]
    window.standardWindowButton(.closeButton)?.isHidden = true
    window.standardWindowButton(.zoomButton)?.isHidden = true
    window.standardWindowButton(.miniaturizeButton)?.isHidden = true
    return window
  

在我的组件上,我添加了以下属性:

.ignoresSafeArea()

我已经遵循了question 中的所有建议,但似乎对我的情况没有任何帮助,感谢任何帮助

【问题讨论】:

在这里工作正常 - Xcode 13.1 / macOS 12.0.1。您放置在此窗口中的 SwiftUI 视图可能存在一些问题(或者您的 MyWindow,因为我使用 NSWindow 进行了测试)。 我尝试了另一个非常简单的SwiftUI,只有一个文本和一个背景颜色,行为仍然相同,底部有一些空间没有正确填充:( 也用纯 NSWindow 试过了,还是不行 @Asperi 也许您可以提供一个运行示例? @OscarFranco:你的代码中的 MyWindow 是什么? 【参考方案1】:

看来我已经复制了你可能拥有的内容

window.contentView = 
  NSHostingView(rootView: 
     Rectangle().fill(Color.red)
       .ignoresSafeArea()                 // << works !!
       .frame(width: 640, height: 480)
    // .ignoresSafeArea()             // << issue when here !!
  )

更多发现:即使在最后使用ignoresSafeArea 时使用最小 W/H 而不是严格的窗口框架也没有问题,即。

.frame(minWidth: 640, minHeight: 480)
.ignoresSafeArea()

【讨论】:

奇怪...不适合我(使用 VStack 和内部文本)...是否也因为我在自己的文件中使用了真正的 swiftUI 结构? 我对此表示怀疑。问题出在 ignoresSafeArea 修饰符上。 嗯...我刚刚尝试使用 VStack 和背景,似乎绘制背景是失败的事情? VStack Rectangle().fill(Color.red) .frame(width: 200, height: 200) .ignoresSafeArea() // 查看更新的部分 - 经过测试,它甚至可以在末尾使用 .background。 在 VStack 上仍然不适合我,但如果我使用 ZStack 并手动绘制矩形作为背景,它确实可以工作

以上是关于macOS SwiftUI,内容不填充没有标题栏的 NSWindow的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 填充距离不一致

如何从 Mac OS 中的 SwiftUI 列表中删除底部/顶部项目填充

如何使用 SwiftUI 在 UICollectionViewCell 中填充内容

SwiftUI:WKWebView 在 macOS 上截断页面内容(NSViewRepresentable)

macOS 上的 SwiftUI:如何为 onDelete 启用 UI(从列表中删除)

SwiftUI List() 在 macOS 上不显示 .children