【Xcode】iPhone用アプリをiPad専用UIレイアウトへと変換するためのベストプラクティスを考えてみた【Storyboard】【SizeClasses】


# どれだけ調べても古い情報しかなかった
visionProでAppleが実現したい**空間コンピューティング**では、モニターを介せずにリアル空間上でアプリが使用できるという世界観だと想像しております。以下のツイートの画像のように、スマホやタブレットで使っていたアプリもそのまま使用することが出来るらしいです。

どうせならiPadのような比較的大きいめなサイズでアプリを操作したいというニーズが高まりそうな予感がします。それであれば、現状iPhoneに特化したアプリは、iPadのサイズにも対応したいと思う開発者は少なくないはず。

https://twitter.com/minnasinario/status/1671791184942108672

しかしどれだけ探してみても、iPhoneデザインをiPadにコンバートするための情報は見当たりませんでした。いや、あるにはあるのですが、いずれも2015年代の比較的古めのものばかりです。ということで今回はQiitaに投稿することにしました。

# 二つの方法を発見！
調査の結果、ざっくりと以下の二つの方法があることがわかりました。
## 1. SizeClasses機能
SizeClassesという機能を使えば簡単にiPad向けレイアウトに変換できる、というところまでは行き着きました。
Size Classesは、「Compact」と「Regular」の2つのカテゴリーでデバイスの縦と横の次元を定義します。

    Compact: スマートフォン（iPhone）などの小さいデバイスや、大きなデバイス（iPad）でも画面が縦向きまたは分割ビューの場合に適用されます。
    Regular: 大きなデバイス（iPad）で画面が横向きで全画面表示の場合に適用されます。

しかし、そこからどう進めばいいのかがわかりませんでした。いずれも古い記事ばかりでXcode自体の仕様が変わってしまっており、「こんな画面無いんだけど！？」と路頭に迷うことばかりでした。

例えば、Xcode13以降は一部のレイアウト（というかVaryForTraitsボタン）が表示されなくなりました。これによりSizeClassesの活用方法がわかりづらくなってしまいました。。どこから編集ができるのかについては、以下で説明していきたいと思っています。

**Xcode12以前**
![スクリーンショット 2023-06-30 9.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/bd3b9f66-839c-9b53-09de-4c7e32fd260c.png)
**Xcode13以降**
![スクリーンショット 2023-06-30 9.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/3015ba94-6649-8325-f675-95d765a29653.png)

## 2. iPad専用のStoryboardを作る
iPhone用storyboardを複製して、新たにiPad用のStoryboardを作るという方法もあるようでした。
iPadの場合は、storyboardの向き先を新しいものに差し替えるというイメージですね。

しかしこちらは今後画面追加になった場合に改修コストが高いことや、バグの発生源になりかねないと感じたので、今回は見送ることにしました。

https://www.jagaimopotato.com/blog/ios-application-development/iphone-storyboard-convert-to-ipad-1454.html

ということで今回は**方法①：SizeClasses**を採用することにします。


# SizeClassesの使い方
今回は以下の画面を元に説明していきます。
スプラッシュ画面としてアプリ起動時に最初に表示されるImageViewを、iPhoneとiPadでサイズ違いにできるようにするのが目標です。
![スクリーンショット 2023-07-01 10.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/57ed633b-8e80-f145-8450-366f9bf72d85.png)

![スクリーンショット 2023-07-01 10.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/fddf30f0-488c-7558-caca-16d723c7d29f.png)
今はこんなどちらもwidthのConstantを250に設定してあります。

## 1. 変更したいConstraintを編集
変更したいViewのConstraintをダブルクリックで選択します。
![スクリーンショット 2023-07-01 10.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/6e76d610-56d8-a0ed-e4b5-0408188b77fe.png)
それから編集していきます。画像矢印のプラスボタンを押下しましょう。

![スクリーンショット 2023-07-01 10.30.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/7dbf1646-9678-c740-d1a6-8a7e16db0881.png)

## 2. CompactとRegularを設定する
デフォルトではInstalledとなっている部分ですが、これを「iPhone用のConstraint」「iPad用のConstraint」のようにして、それぞれ個別のものとして設定することが可能になります。

ここで登場するのがRegular、Compactという概念。
ざっくりと「**Compact=iPhone**」「**Regular=iPad**」と捉えてもらえると理解しやすいと思います。
正しい区分が知りたい方はこの方の記事などがおすすめです。

https://qiita.com/kamomeKUN/items/4edd9c8dd693f1f96cdc

#### まずはiPad用（Regular）のConstraintを作成
storyboardで表示している画面がiPhoneであればCompact、iPadであればRegularを選択します。今回私が設定したいconsraintは「iPad、width」のものなので、以下画面のように設定すればOKです。
![スクリーンショット 2023-07-02 12.10.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/3c2ac6c8-9df1-59cc-dd19-338256f583dc.png)

![スクリーンショット 2023-07-02 12.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/98a7b585-1adf-9ba9-a1f2-2036381efd50.png)


デフォルトのInstalledは不要なのでチェックを外しましょう。

![スクリーンショット 2023-07-02 12.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/92e38105-482d-c362-ecf3-e2cc36408ecc.png)

これでiPad用のconstraintを作成することが出来ました。
続いてiPhone用のconstraintも作成しましょう。


#### iPhone用（Compact）のConstraintを作成
もう一つ別のConstraintを作りたいのですが、どうすれば作成すれば良いのかが少しわかりづらいので注意です。
先ほど私はstoryboardでiPad用のViewを表示していたので、今度はiPhone用のViewになるようにします。

![スクリーンショット 2023-07-02 12.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/b3571844-d091-75b7-0e9b-bb13d8d1a962.png)

![スクリーンショット 2023-07-02 12.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/27262553-0e0a-bc06-5ccd-ffb9216f3a6e.png)

すると、先ほどのImageViewにはwidthのConstraintが適用されていないことがわかります。

![スクリーンショット 2023-07-02 12.16.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/eb55e109-bc15-92d9-263e-84042a58bdc4.png)

改めてwidthを設定し、編集しましょう。

![スクリーンショット 2023-07-02 12.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/1d6c654b-a6ae-f850-f135-ab6078886c3d.png)

あとはiPadの時と同じ手順で設定すれば完了です。

![スクリーンショット 2023-07-02 12.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/36692efe-163a-3f83-10ad-1a0a6330147d.png)

ここまで設定すると、このような感じでwidthのConstraintが二つ反映されていることがわかると思います。

![スクリーンショット 2023-07-02 12.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/0fa6d692-d3c5-f0f4-60ba-3596d40b46c0.png)

実際にiPad、iPhoneのシミュレーターなどでビルドしてみると、端末によって異なるサイズの画像が表示されるようになりました！これで目的が達成しました！面倒な手順のように感じてしまいますが、一度覚えてしまうと簡単ですね！

![スクリーンショット 2023-07-02 12.21.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/2be051ee-b097-f362-e8b5-8c78055664c7.png)
![スクリーンショット 2023-07-02 12.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653721/703c9860-ef72-76e0-97bd-69a64d2cbc61.png)

## Q.iPhoneを横画面にした時のレイアウトを作りたい場合は？
例えばiPhoneでも、縦方向と横方向でレイアウトを変えたいという場合があると思います。この場合も同様にSizeClassesでコントロールが可能です。こちらについても話をすると複雑になってしまうかなと思ったので今回は割愛します。

もし必要であれば、以下の動画がかなり参考になるのでチェックしてみてください。

https://www.youtube.com/watch?v=pZuNhxR_uRg


## Q.storyboardではなく、動的にソースコード上でサイズを設定したい場合は？
今回はstoryboardでSizeClassesを使用する手順についてまとめました。
コード上で端末ごとのサイズを指定したい場合には、こちらの方の記事がとても参考になります！

https://qiita.com/kamomeKUN/items/4edd9c8dd693f1f96cdc

# おまけ
質問などあればいつでもご連絡ください。
Twitterもやってます。
https://twitter.com/minnasinario
開発したアプリの一覧はこちらから！
https://lit.link/taminaryousuke

一番バズったアプリは「ガチャメーカー」です！

https://apps.apple.com/jp/app/%E3%82%AC%E3%83%81%E3%83%A3%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC-%E3%81%82%E3%81%AA%E3%81%9F%E3%81%A0%E3%81%91%E3%81%AE%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%82%AC%E3%83%81%E3%83%A3%E3%82%92%E4%BD%9C%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA/id1617490189


# 参考
https://www.youtube.com/watch?v=pZuNhxR_uRg

https://qiita.com/kamomeKUN/items/4edd9c8dd693f1f96cdc

https://www.jagaimopotato.com/blog/ios-application-development/iphone-storyboard-convert-to-ipad-1454.html