Tana Gone
Tana Gone
~1 min read

Categories

App起動時にNSWindowへのインスタンスを取得しsetConterntSizeメソッドを呼び出せば良い

frameモディファイアで設定できるminWidth, minHeighはWindow Resize時には有効なのだが…

AppKitでは出来る起動時のWindow Size指定がSwiftUI@macOS 26では出来ない様だ。

fixedSizeWindow

App起動時にNSWindowのインスタンスを取得

起動の順番はApp▶️Scene▶️ContentView。ContentViewがWindowを生成する直前(onAppearイベント)にNSWindowのインスタンスが取得できる。

import SwiftUI
import AppKit
@main
struct Bg_GeometryApp: App {
  var body: some Scene {
    WindowGroup {
      ContentView()
        .onAppear {
          DispatchQueue.main.async {
            if let window = NSApplication.shared.windows.first {
              let fixedSize = NSSize(width: 500, height: 200)
              window.setContentSize(fixedSize)
//              window.center()
            }
          }
        }
    }
  }
}

おまけ: 起動後にWindowサイズを制限する

frameモディファイアでidealWidth, idealHeightを設定しても起動時のWindowサイズは固定できない。下記のコードではWindowサイズをResize時にwindowSizeプロパティに設定するコードも合わせて加えられている。
frameが返すViewのサイズ、つまりWindow全体に広がったView(maxWidht: .infinity, maxHeight: .infinity)のサイズはViewのbackgroundにあるGeometryReader(これもView)のサイズがそれだ。


import SwiftUI
struct ContentView: View {
  @State var windowSize: CGSize = .zero
  var body: some View {
    Text("Fixed window size: \(String(format: "%.0f %.0f", windowSize.width, windowSize.height))")
      .frame(minWidth: 500, maxWidth: .infinity, minHeight: 200, maxHeight: .infinity)
//      .frame(minWidth: 500, idealWidth: 500, maxWidth: .infinity, minHeight: 200,
//             idealHeight: 200, maxHeight: .infinity)
      .background(
        GeometryReader { geometry in
          Color.blue
            .onChange(of: geometry.size) { _, newSize in
              print("window size:\(newSize.width) \(newSize.height)")
              windowSize = newSize
            }
        }
      )
  }
}