プログラムによるアプリのサイズ変更動作の管理
既定では、関数 uifigure を使用して作成されたアプリはサイズ変更可能です。アプリ ユーザーが実行時にウィンドウのサイズを変更すると、コンポーネントの位置とサイズが自動的に変更されます。
アプリのサイズ変更をより柔軟に行う場合は、次のいずれかの方法を使用します。
グリッド レイアウト マネージャーの使用 — コンポーネントをグリッドに追加し、グリッドの行と列をどのようにサイズ変更するのかを指定します。
サイズ変更動作を管理するコードの記述 — UI コンポーネントのサイズを変更する
SizeChangedFcnコールバックを記述します。Figure ウィンドウのサイズが変更されるごとにコールバックが実行されます。特定のコンポーネントのサイズ変更の無効化 — アプリ内の特定のコンテナーの
AutoResizeChildrenプロパティを指定します。アプリのサイズ変更の完全な無効化 — Figure の
Resizeプロパティを'off'に設定します。
グリッド レイアウト マネージャーの使用
グリッド レイアウト マネージャーは、UI コンポーネントをグリッドでレイアウトできるコンテナーです。グリッド レイアウト マネージャーを構成して、グリッド内のコンポーネントの初期レイアウトとサイズ変更動作を指定できます。
関数 uigridlayout を呼び出し、最初の引数として Figure を指定することで、UI Figure ウィンドウにグリッド レイアウト マネージャーを作成します。グリッド レイアウト マネージャーの RowHeight プロパティと ColumnWidth プロパティを設定して、アプリ ユーザーが Figure ウィンドウのサイズを変更したときの各行および各列の動作を指定します。RowHeight および ColumnWidth は、行または列ごとに 1 つの値をもつ cell 配列として指定します。行の高さおよび列の幅には、次の 3 つの異なるタイプがあります。
適合サイズ —
'fit'を指定します。自動的に内容が収まるように行の高さまたは列の幅が固定されます。アプリのサイズが変更されても、次元は変更されません。固定サイズ — ピクセル単位で数値を指定します。行の高さまたは列の幅は、指定されたピクセル数で固定されます。アプリのサイズが変更されても、次元は変更されません。
可変サイズ — 文字
'x'と組み合わされた数値を指定します (たとえば、'1x')。可変の高さの行は、固定の高さの行によって使用されずに残っている縦方向のスペースを埋めます。可変の幅の列は、固定の幅の行によって使用されずに残っている横方向のスペースを埋めます。文字'x'と組み合わせる数値は、残りのスペースを分割するための重みです。ここで、スペースの量はこの数値に比例したものになります。たとえば、ある行の幅が'2x'で別の行の幅が'1x'の場合、アプリのサイズが変更されたときに最初の行が 2 番目の行の 2 倍に拡大または縮小されます。
たとえば、次のコードでは 4 つの行を含むグリッド レイアウト マネージャーを作成しています。1 番目の行の高さをその内容が収まるようにサイズ設定し、2 番目の行を 200 ピクセルに固定し、最後の 2 行で残りの縦方向のスペースを不均等に共有します。3 番目の行は、4 番目の行の 2 倍のスペースを使用します。
fig = uifigure;
gl = uigridlayout(fig,[4 1]);
gl.RowHeight = {'fit',200,'2x','1x'};グリッド レイアウト マネージャーを使用したアプリのレイアウトの詳細については、プログラミングによるアプリのレイアウトを参照してください。
例: グリッド レイアウト マネージャーを使用したサイズ変更可能なアプリ
この例では、グリッド レイアウト マネージャーを構成してアプリのサイズ変更動作を指定する方法を示します。アプリには、ドロップダウン、リスト ボックス、データを含むテーブルが含まれています。3 行 2 列のグリッド レイアウトを使用して UI Figure ウィンドウを作成します。次に、UI コンポーネントを作成し、Layout.Row プロパティおよび Layout.Column プロパティを指定してグリッド レイアウトに追加します。
fig = uifigure; gl = uigridlayout(fig,[3 2]); dd = uidropdown(gl); dd.Layout.Row = 1; dd.Layout.Column = 1; lb = uilistbox(gl); lb.Layout.Row = 2; lb.Layout.Column = 1; tbl = uitable(gl); tbl.Data = rand(100); tbl.Layout.Row = [1 3]; tbl.Layout.Column = 2;
グリッド レイアウト マネージャーの RowHeight プロパティと ColumnWidth プロパティを設定して、アプリのレイアウトとサイズ変更の動作を構成します。
最初の行には
'fit'を指定します。これにより、ドロップダウンの高さに合うように行の高さが自動的に調整されます。2 番目の行には高さ 80 ピクセルを指定します。これにより、アプリのサイズが変更されても、リスト ボックスの高さは固定されたままです。
3 番目の行には高さ
'1x'を指定します。これにより、残っている縦方向のスペースが埋められます。最初の列に幅
'1x'、2 番目の列に幅'2x'を指定します。これにより、すべてのコンポーネントが横方向にサイズ変更され、テーブルが常に他のコンポーネントの 2 倍の横方向のスペースを占有するようになります。
gl.RowHeight = {'fit',80,'1x'};
gl.ColumnWidth = {'1x','2x'};
ウィンドウの隅のいずれかをドラッグして Figure ウィンドウのサイズを変更します。UI コンポーネントが、グリッド レイアウトの仕様に従ってサイズ変更されます。

サイズ変更動作を管理するコードの記述
グリッド レイアウト マネージャーでサポートされていないサイズ変更動作を提供する場合は、SizeChangedFcn コールバックを使用したアプリのレイアウトの管理を検討してください。たとえば、以下を行う場合にこの方法を使用します。
定義する最小サイズまでまたは最大サイズまで、コンポーネントのサイズを変更する。
非線形のサイズ変更動作を実装する。
この方法でサイズ変更動作を指定するには、次の手順に従います。
アプリ内の各コンテナーにコールバック関数を記述して、ウィンドウ サイズの変更時にその子のレイアウトを管理します。
各コンテナーの
AutoResizeChildrenプロパティを'off'に設定して、自動サイズ変更をオフにします。AutoResizeChildrenプロパティが'on'の場合はコンテナーのSizeChangedFcnコールバックが実行されないため、この手順が必要です。各コンテナーの
SizeChangedFcnプロパティを、適切なコールバック関数へのハンドルに設定します。
最も正確な結果が得られるように、各コンテナーのすべてのレイアウトのコードを SizeChangedFcn コールバックの内側に配置することをお勧めします。
SizeChangedFcn コールバックは、次のいずれかが生じると実行されます。
コンテナーが初めて表示された。
コンテナーがサイズ変更中に表示された。
コンテナーがサイズ変更後に初めて表示された。これは、コンテナーが非表示の間にサイズが変更され、その後表示された場合に発生します。
ヒント
SizeChangedFcn が使用する変数がすべて定義されるまで、コンテナーの表示を遅延させることをお勧めします。これにより、SizeChangedFcn コールバックがエラーを返すのを防ぐことができます。コンテナーの表示を遅延させるには、Visible プロパティを 'off' に設定します。SizeChangedFcn コールバックが使用する変数を定義した後で、Visible プロパティを 'on' に設定します。
例: SizeChangedFcn を使用したサイズ変更可能なアプリ
この例では、カスタムのサイズ変更ロジックを使用してボタン グループ内のトグル ボタンのサイズを管理し、座標軸セットの縦横比を固定するアプリを作成する方法を示します。現在のフォルダー内に sizeChangedApp.m という名前のファイルを作成し、ファイルの先頭で main 関数 sizeChangedApp を定義します。
createComponents という名前の補助関数を記述して Figure および UI コンポーネントを作成し、その UI コンポーネントを Figure の UserData に保存します。これにより、Figure のコールバック関数 SizeChangedFcn 内でアプリのデータにアクセスできます。アプリのデータの共有の詳細については、コールバック間のデータ共有を参照してください。
アプリの main 関数で関数 createComponents を呼び出してから、Figure ウィンドウを表示します。
function sizeChangedApp fig = createComponents; fig.Visible = 'on'; end % Create UI components function fig = createComponents fig = uifigure('Visible','off', ... 'AutoResizeChildren','off', ... 'SizeChangedFcn',@figResize); btngrp = uibuttongroup(fig, ... 'AutoResizeChildren','off', ... 'SizeChangedFcn',@bgResize); btn1 = uitogglebutton(btngrp); btn2 = uitogglebutton(btngrp); ax = uiaxes(fig); % Store components fig.UserData = struct(... 'ButtonGroup',btngrp, ... 'Button1',btn1, ... 'Button2',btn2, ... 'Axes',ax); end
次に、Figure ウィンドウに対して 1 つのサイズ変更関数 SizeChangedFcn を記述し、ボタン グループに対してもう 1 つのサイズ変更関数を記述します。各関数により、その直下の子のサイズ変更動作を管理します。
Figure ウィンドウでは、figResize という名前のコールバックを記述して、ユーザーがウィンドウのサイズを変更するたびに ButtonGroup および Axes オブジェクトの位置とサイズを管理します。
Figure の左半分全体にまたがるようにボタン グループを配置します。
正方形の縦横比、および Figure の右半分の中心の位置を維持するように座標軸を配置します。
axdimでピクセル数を指定して、Axesオブジェクトの幅と高さが同じになるように設定します。axdimの値は、Figure の右半分を完全に埋める値です。ただし、座標軸の各サイズで 10 ピクセルの余白をもたせ、また座標軸が正方形のままになるという制約に従います。コマンドaxdim = max(axdim,0)により、座標軸の大きさが負にならないようにします。座標軸が Figure の右半分内の横方向の中心に配置されるように、座標軸の左端
axleftを設定します。座標軸が Figure 内の縦方向の中心に配置されるように、座標軸の下端
axbottomを設定します。
function figResize(src,event) % Get UserData to access components data = src.UserData; % Get figure size figwidth = src.Position(3); figheight = src.Position(4); % Resize button group data.ButtonGroup.Position = [1 1 figwidth/2 figheight]; % Resize axes axdim = min(figwidth/2,figheight) - 20; axdim = max(axdim,0); axleft = figwidth/2 + (figwidth/2-axdim)/2; axbottom = (figheight-axdim)/2; data.Axes.Position = [axleft axbottom axdim axdim]; end
ボタン グループでは、bgResize という名前のコールバックを記述して、ToggleButton オブジェクトの位置とサイズを管理します。このコールバックは、ButtonGroup オブジェクトのサイズが変更されるたびに実行されます。このサイズの変更は、ユーザーが Figure ウィンドウのサイズを変更するたびに生じます。この関数では、ButtonGroup オブジェクトのサイズを基準として 2 つのトグル ボタンを相対的に配置します。
各トグル ボタンの左端
btnleftと幅btnwidthを設定し、左右の両側でボタンの端とコンテナーの端の間に 20 ピクセルのスペースが確保されるようにします。各トグル ボタンの高さ
btnheightをボタン グループの高さの 6 分の 1 に設定します。上のボタンの上側のスペースおよび下のボタンの下側のスペースがボタン グループの高さの 4 分の 1 になるように、各トグル ボタンの下端
btn1bottomおよびbtn2bottomを設定します。
以下にアプリのコードを示します。
function bgResize(src,event) % Get UserData to access components fig = ancestor(src,'figure','toplevel'); data = fig.UserData; % Get button group size bgwidth = src.Position(3); bgheight = src.Position(4); % Resize button group btnleft = 20; btn1bottom = bgheight/4; btn2bottom = (7/12)*bgheight; btnwidth = bgwidth-40; btnheight = bgheight/6; data.Button1.Position = [btnleft btn1bottom btnwidth btnheight]; data.Button2.Position = [btnleft btn2bottom btnwidth btnheight]; end
アプリを実行してから、Figure ウィンドウのサイズを変更します。アプリ内のコンポーネントのサイズが Figure ウィンドウのサイズを基準として変更されます。
sizeChangedApp

特定のコンポーネントのサイズ変更の無効化
AutoResizeChildren プロパティは、グリッド レイアウト マネージャーも SizeChangedFcn コールバックも使用せずにアプリの自動サイズ変更動作を制御します。UI Figure、パネル、またはタブなどのすべてのアプリ コンテナーに AutoResizeChildren プロパティがあります。このプロパティは既定では 'on' に設定されています。コンテナーで AutoResizeChildren が 'on' に設定されている場合、アプリ ユーザーが Figure ウィンドウのサイズを変更すると、アプリはそのコンテナーの子のサイズを自動的に変更します。このプロパティを使用して、特定のコンポーネントのサイズ変更を選択的にオフにするには、次のようにします。
自動サイズ変更を完全にオフにするには、メイン Figure ウィンドウの
AutoResizeChildrenを'off'に設定します。特定のコンポーネントの自動サイズ変更をオフにするには、該当するコンポーネントの親を、
AutoResizeChildrenが'off'に設定されているコンテナーに設定します。
親コンテナーとそのいずれかの子の AutoResizeChildren プロパティを変更する場合は、まず親コンテナーの値を設定してから、子コンテナーの値を設定します。
アプリのサイズ変更の完全な無効化
Figure ウィンドウの Resize プロパティは、アプリ ユーザーがウィンドウを対話的にサイズ変更できるかどうかを制御します。Resize の既定値は 'on' です。アプリのレイアウトや動作で一貫したウィンドウ サイズが重要な場合は、Resize を 'off' に設定することを検討してください。