モチベーション
Apple SiliconによるiOSがiPadOS / macOSに統合の流れがあり、SwiftUIで広い画面を想定した実装を心がけた方が何かと役に立ちそう
iPad and iPhone apps on Apple Silicon Macs
チェック項目
- iPadOS向けビルドするには何をすればいいのか?
- フルSwiftUIに移行するにはどうすればいいのか?mainに何を書けばいいのか?
- OS(Sizeに応じて)出し分けたい
- readable width などのOS標準が無いか調べる
- iPhoneで回転せず、iPadでのみ回転させたい
iPadOS向けビルドするには何をすればいいのか?
ビルド対象の追加
[Target] > [General] > [Deployment Info] の iPad にチェックがついていれば良い。
NavigationViewでフルスクリーン表示する
NavigationView
をデフォルトのまま利用すると、iPad上ではカラム表示されてしまいます。
NavigationView
を使うがiPadでも全画面で利用したい場合に下記の設定を入れる。
NavigationView {
... some view
}
.navigationViewStyle(StackNavigationViewStyle())
フルSwiftUIに移行するにはどうすればいいのか?mainに何を書けばいいのか?
App名と同じ.swiftファイルを作成する
メインとなるアプリ用のstructを用意し、bodyの中でWindowGroupを宣言する。
@main
struct HogeApp: App {
@StateObject private var model = HogeModel()
@StateObject private var store = Store()
var body: some Scene {
WindowGroup {
HogehogeContentView()
.environmentObject(model)
.environmentObject(store)
}
}
}
ScreenDelegateとAppDelegateを消す
ScreenDelegateとAppDelegateを消すだけで良いと言われたが、下記エラーが発生
Could not find a storyboard named 'Main' in bundle NSBundle
Info.plist内のApplication Session Role
以下の内容をまるっと消すと動いた
OS(Sizeに応じて)出し分けたい
readable width などは無さそう、自前でmaxWidthを設定する必要がありそう
iPadの設定アプリなどのTableViewを見ると項目が画面幅最大まで広がらず、適度な大きさにとどまる様になっています。
この設定は readableContentGuide として主にTableViewなどで利用されています。
SwiftUIに上記の様な仕組みがあるか、確認したが見当たらなかった。
いずれは追加されるかもしれないが、一時的な解決策としてViewに対してmaxWidth
を設定するようにしました。
幅の参考値としてiOSでの読みやすい幅を読んだところ、サイズに関わらず672
が設定されるケースが多かったためその値を採用しました。
iPhoneで回転せず、iPadでのみ回転させたい
こちらは想定通りでは有りませんがWorkaround的に動いているので記載します。正しい解決方法など有りましたコメントいただけますとありがたいです。
やはり必要だったAppDelegateファイルを再度用意し、回転動作を縦画面(.portrait)に固定します。
class AppDelegate: NSObject, UIApplicationDelegate {
private static var orientationLock = UIInterfaceOrientationMask.portrait
func application(_ application: UIApplication,
supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
AppDelegate.orientationLock
}
}
次に、AppファイルにAppDelegateを結びつけます
@main
struct HogeApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
/* ... */
}
現状(Xcode 12)はこの設定がiOSでしか有効にならず、iPadOSでは無視され回転してしまいます。
目的は達成されているので、一旦このままにします。
最後に
目に見える範囲だけ対応しましたので、他に懸念などお気づきの点があれば指摘、コメントお願い致します。