Macos 更新NSWindow内容大小以适应SwiftUI视图

Macos 更新NSWindow内容大小以适应SwiftUI视图,macos,swiftui,nswindow,Macos,Swiftui,Nswindow,我有一个SwiftUI视图,由于长度可变的字符串(例如,由于本地化),它不知道的大小。我需要调整包含NSWindow的大小以修复内容。我可以提供固定/最小宽度 使用AppKit委托创建新的Mac应用程序会产生一个相当简单的AppDelegate: 导入可可粉 导入快捷键 @主要 类AppDelegate:NSObject,NSApplicationDelegate{ func ApplicationIDFinishLaunching(通知:通知){ //创建提供窗口内容的SwiftUI视图。 让

我有一个SwiftUI视图,由于长度可变的字符串(例如,由于本地化),它不知道的大小。我需要调整包含
NSWindow
的大小以修复内容。我可以提供固定/最小宽度

使用AppKit委托创建新的Mac应用程序会产生一个相当简单的AppDelegate:

导入可可粉
导入快捷键
@主要
类AppDelegate:NSObject,NSApplicationDelegate{
func ApplicationIDFinishLaunching(通知:通知){
//创建提供窗口内容的SwiftUI视图。
让contentView=contentView()
//创建窗口并设置内容视图。
window=NSWindow(
contentRect:NSRect(x:0,y:0,宽度:480,高度:300),
样式掩码:[.标题、.closable、.Minimable、.Resize、.fullSizeContentView],
备份:。已缓冲,延迟:false)
window.isReleasedWhenClosed=false
window.center()
window.setFrameAutosaveName(“主窗口”)
window.contentView=NSHostingView(rootView:contentView)
车窗。MakeKeyandDerfront(无)
}
}
然后,我有一个快捷界面,带有一个按钮,可以添加到标签的文本中,以模拟更改文本:

导入快捷界面
结构ContentView:View{
@State var text=“你好,世界!”
var body:一些观点{
VStack{
文本(文本)
.frame(maxWidth:无穷大,maxHeight:无穷大)
按钮(“添加一些文本”){
text+=“\n你好,世界!”
}
}
}
}
单击按钮最终会导致添加太多的文本行,标签会被截断


当SwiftUI视图的大小发生变化时,如何更新容器窗口的内容大小?

据我所知,您需要以下内容(使用Xcode 12.1测试)

struct ContentView:View{
@State var text=“你好,世界!”
var body:一些观点{
VStack{
文本(文本)
.frame(maxWidth:无穷大,maxHeight:无穷大)
按钮(“添加一些文本”){
text+=“\n你好,世界!”
}
}

.frame(minWidth:480,minHeight:300)//这太完美了,太简单了!我从来没有在AppKit中使用过它,尽管它在SwiftUI中会更复杂。作为奖励,您知道如何设置大小更改的动画和/或保持窗口居中吗?如果添加了最大宽度并对文本进行了换行(例如,删除
\n
并添加最大宽度)当视图位于
minHeight
时,它开始截断。这也可以解释吗?
struct ContentView: View {
    @State var text = "Hello, World!"

    var body: some View {
        VStack {
            Text(text)
                .frame(maxWidth: .infinity, maxHeight: .infinity)
            Button("Add Some Text") {
                text += "\nHello, World!"
            }
        }
        .frame(minWidth:480, minHeight: 300)     // << this for default
        .fixedSize()                             // << this to update container 
    }
}