【问题标题】:Update NSWindow content size to fit SwiftUI view更新 NSWindow 内容大小以适应 SwiftUI 视图
【发布时间】:2021-02-26 08:33:15
【问题描述】:

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

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

import Cocoa
import SwiftUI

@main
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Create the window and set the content view.
        window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered, defer: false)
        window.isReleasedWhenClosed = false
        window.center()
        window.setFrameAutosaveName("Main Window")
        window.contentView = NSHostingView(rootView: contentView)
        window.makeKeyAndOrderFront(nil)
    }
}

然后我有一个带有按钮的 SwiftUI,该按钮添加到标签的文本以模拟更改文本:

import SwiftUI

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!"
            }
        }
    }
}

单击按钮最终会导致添加过多的文本行并截断标签。

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

【问题讨论】:

    标签: macos swiftui nswindow


    【解决方案1】:

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

    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 
        }
    }
    

    【讨论】:

    • 这太完美了,多么简单!我从来没有使用过 AppKit,所以使用 SwiftUI 会更复杂。作为奖励,您知道如何为大小变化设置动画和/或保持窗口居中吗?
    • 如果添加了最大宽度并且文本换行(例如,删除 \n 并添加最大宽度),一旦视图位于 minHeight,它就会开始截断。这也能算吗?
    猜你喜欢
    • 2011-11-03
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多