Power Apps でレスポンシブ (デバイスに合わせて画面サイズを最適化する) なアプリを作成する

# はじめに

よく、PC とモバイル両方で利用できるアプリを作成したいという要望をいただくことがあります。

つまり、アプリ利用者が使うデバイスによってアプリのサイズをいい感じに調整するアプリを作りたいということです。

そういった、ユーザーが使用するデバイスの画面サイズに応じて表示を最適化することをレスポンシブ (デザイン)  と呼ぶ認識です。

以前から Power Apps ではレスポンシブなアプリを作成することが出来ましたが、個人的に少し難易度が高かったという認識です。

しかし、最近のアップデートにより以前より簡単になった、選択肢が増えたという認識のため、今回は、Power Apps ではレスポンシブなアプリを作成するアプローチを整理してみたいと思います。

:::note warn
個人的には、アプリの主要な利用者が使うデバイスが決まっている場合は、まず、そちらに合わせたアプリを作成し、別のデバイスで利用するケースが増えた際に検討するのでもいいかと思っています。

例えば、アプリ利用者が基本モバイルデバイスを使う場合は、まずはモバイルレイアウトで作成し、PC 利用者が増えた際、そちらをそのまま利用することでどうしても支障がある場合 (大体のケースでは、モバイルレイアウトでも PC から使っていたも支障はない認識です)、PC 向けに別途作成するか検討するといった感じです。

もちろん、アプリのデザインによっては、レスポンシブなアプリにする難易度が高い場合があるため、その場合は、アプリの主要な利用者が使うデバイスを踏まえ作成するのがよいと思います。
:::

# データからの自動作成

データからアプリ作成を開始する場合、自動でレスポンシブなアプリになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/02c5053d-5802-9af0-a7bb-95d8c61c9ea1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c69bc07f-8a0f-6f08-9cfe-797029cb7d69.png)

以下は、以前別記事で紹介したアプリで、デバイスによってサイズが調整されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ab7cfd50-9ac3-8c87-7fa2-6a51c38ebed5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/abe14c84-a53b-2c71-e434-1f1bd5002bb3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bc612c5a-d224-2f4f-3187-901b7afbd448.png)

:::note
アプリのプレビュー実行で、利用するデバイスのよって、アプリのレイアウトがどのようになるか確認することが出来ます。
:::

# 画面のレイアウトを利用する

以下のレイアウトを利用する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/120778aa-d66d-3e64-ebcb-984e91c8cb97.png)

試しに、こちらのヘッダーとフッターのレイアウトを利用してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a58db2cc-0752-2432-4d68-7b03681455f3.png)

まず、新規で空のアプリを作成した場合、以下の設定をオフにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cc756baf-7d2d-7a3e-27d4-89320734136f.png)

次に、こんな感じで部品を配置してみます。タイトルラベルの`[Width]`プロパティをParent.With に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/df9fd399-f4ff-cb67-a0ee-7f041e665989.png)

フォームコントロールを利用する場合、そのままだと、モバイルレイアウト時に右端が切れてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ff0d3961-85ee-f13a-b1c2-a004953091c5.png)

そのため、データカードの`[Width]`プロパティを以下のように `Parent.With` に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/785563c7-4455-bf40-aedc-3df78b63a02a.png)

右端が切れなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e2e492b9-6298-4a81-a5e8-b18f722a69e6.png)

※利用する可能性のあるデバイスを踏まえ、必要に応じて、最小幅を変更します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a7699e80-e084-a539-d345-452f07d7f97d.png)


:::note
コンテナ内に追加する、(アプリの幅全体に表示する目的の) コントロール  の`[Width]`プロパティを`Parent.With` に変更します。他にも、以下の Host オブジェクトの `[OSType]` プロパティを利用し、If 文などで `[Width]`プロパティの値を変更する方法も考えられます。自由度は高いかもしれませんが、少し面倒かもしれません。
:::

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/object-host

# 独自の入力フォームを使いたい場合

フォームコントロールではなく、独自の入力フォームを使いたい場合もあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8b8597b4-9a4a-f0b8-357d-a70028d01b66.png)

このような場合、モバイルで表示するとコントロールがうまく表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7ad3c725-f2f5-815a-8c8e-2c17204def94.png)

この場合、こちらのスクロール可能なテンプレートを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8496a493-87e2-60ff-ae21-1b3b184d546d.png)

そして、既存のセクションを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1464f92c-9c88-5e58-35cd-9155ff847241.png)

次に、`Canvas`をレイアウトの`MainContainer` にコピーします。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e3af6fd4-ac55-728b-d802-5762e1c8a908.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bed26c2e-64b0-6915-90d2-55239068430b.png)

そして、セクションを追加していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8ee4b98a-5629-eb8c-889b-053c8f78322a.png)

追加したセクションにコントロールをコピーしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b7fd0860-f89a-ff92-51a4-d7e19b77e0f1.png)

画面サイズいっぱいに広げる入力コントロールがある場合は、DataCard や中のコントロールのサイズを `Parent.Width` をベースにして調整します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d6d317aa-b15a-50b5-e7a7-f6753865b43a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/37f202bf-d233-c411-dee6-ebcc132be347.png)

各 DataCard の以下のプロパティをオンにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6bbf31b5-05b0-3095-e582-14c72806b249.png)

テストしてみます。いい感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c0a27335-5e3b-60d6-20a5-099a658ab867.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c52a262b-9ea1-2592-5e44-06b326487229.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b21377f6-f35a-672d-ea8d-440db577a5a9.png)

# ギャラリーの横幅が広い場合

こんな感じでギャラリーを使うケースで、ギャラリーの横幅が広い場合、モバイルだと全て表示されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e4f20fe1-87ad-669e-2848-6822b793c4c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/690ca7a9-69be-f77d-6ab8-1d5bb140337e.png)

こちらの対策について、まず、コンテナ内のギャラリーの`[Width]`プロパティを以下の通り､ギャラリー内の右端のコントロールの`[X]`、`[Width]`プロパティをベースに変更します。
また、配置も`先頭`に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9d9fb3dc-602a-79df-8b8e-a666be4fa8f5.png)

ギャラリー内のそれぞれのコントロールの`[X]`プロパティを以下のように前のコントロールのプロパティをベースに変更しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/492cbd21-a8d0-c80e-723d-9ba8985a7e2d.png)

コンテナの`水平方向のオーバーフロー`を`スクロール`にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b7bd4f55-6877-9ec6-880c-740970fab01c.png)

試してみます。画面のサイズに応じてスクロールバーで右端まで表示が出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3dd33e41-c31f-4258-a800-dbfb55906c34.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f340290c-5b58-2575-e921-67acf556f396.png)

ヘッダー的なものをつける場合は、以下のように`[Width]`プロパティをギャラリーと同じにし、配置も`先頭`に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/38d1d4fa-7f70-f7b9-c4cf-a60c09dd2cfe.png)

個々のテキストラベルの`[X]`、`[Width]`プロパティをギャラリー内のコントロールと同じにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/96c8c076-d07c-a747-0acf-efa2cd41ebe2.png)

# まとめ

今回は、Power Apps でレスポンシブ (デバイスに合わせて画面サイズを最適化する) なアプリを作成す方法について、情報を整理してみました。
アプリの機能がある程度限定されている場合は、こちらで紹介した方法で実現できると思うので、そのような機会がある場合は参考にしていただけると幸いです。