SwiftUIでウインドウサイズを設定する方法

SwiftUIでmacOSアプリを作っていて、ウインドウサイズの初期値や最大値、最小値を設定する方法について解説します。

スポンサーリンク

WindowGroupを使っているとき

WindowGroupを使っているコードでウインドウを定義するコードが次のようになっているとします。

import SwiftUI

@main
struct FrameSizeApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

このコードではContentViewというビューがウインドウのルートビューになっています。SwiftUIはウインドウサイズをルートビューの大きさに従って決定します。このサンプルコードの場合は、ContentViewの大きさが指定されていないので、ContentViewの内容にフィットするサイズで作成されます。

ルートビューのサイズの初期値、最小値、最大値を設定する

ContentViewのサイズの初期値や最小値、最大値を指定するには、frame()モディファイアを使用します。次のコードは、最小値を100px * 100px、初期値を200px * 200px、最大値を300px * 300pxに指定するコード例です。

import SwiftUI

@main
struct FrameSizeApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .frame(minWidth: 100, idealWidth: 200, maxWidth: 300,
                       minHeight: 100, idealHeight: 200, maxHeight: 300,
                       alignment: .center)
        }
    }
}

各引数の意味は次の通りです。

引数 説明
minWidth 幅の最小値
idealWidth 幅の初期値
maxWidth 幅の最大値
minHeight 高さの最小値
idealHeight 高さの初期値
maxHeight 高さの最大値
alignment ルートビューの揃え位置

alignmentはウインドウの揃え位置ではない

alignmentはスクリーン内でのウインドウの揃え位置ではなく、ウインドウ内のルートビューの揃え位置であることに注意してください。ウインドウはスクリーン内の中央のやや上に配置されます。このやや上ですが、人間にとって見やすい位置ということが考慮されています。

スポンサーリンク

ウインドウ位置をクリアする

SwiftUIではウインドウの位置が記憶され、アプリを再起動時、終了時の位置とサイズが復帰します。記憶された値をクリアするには、ターミナルからdefaultsプログラムを使ってクリアします。

% defaults delete アプリバンドル識別子

但し、この方法はアプリのユーザーデフォルトを全てクリアしてしまい、他の設定値もクリアしてしまいます。ウインドウ位置だけをクリアしたい場合は、次のように入力して、ウインドウ位置を記憶しているキーを調べてクリアします。(com.rk-k.FrameSizeはアプリバンドル識別子です。対象のアプリの値に置き換えてください)

% defaults read com.rk-k.FrameSize
{
    "NSWindow Frame SwiftUI.ModifiedContent<FrameSize.ContentView, SwiftUI._FlexFrameLayout>-1-AppWindow-1" = "140 1122 190 190 0 0 2560 1415 ";
}
% defaults delete com.rk-k.FrameSize "NSWindow Frame SwiftUI.ModifiedContent<FrameSize.ContentView, SwiftUI._FlexFrameLayout>-1-AppWindow-1"
スポンサーリンク
最新情報をチェックしよう!