1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iPadOS / macOSに対応しているか確認する

Posted at

モチベーション

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 にチェックがついていれば良い。
image.png

NavigationViewでフルスクリーン表示する

NavigationViewをデフォルトのまま利用すると、iPad上ではカラム表示されてしまいます。
NavigationViewを使うがiPadでも全画面で利用したい場合に下記の設定を入れる。

NavigationView {
   ... some view
}
.navigationViewStyle(StackNavigationViewStyle())

フルSwiftUIに移行するにはどうすればいいのか?mainに何を書けばいいのか?

App名と同じ.swiftファイルを作成する

メインとなるアプリ用のstructを用意し、bodyの中でWindowGroupを宣言する。

HogeApp.swift
@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以下の内容をまるっと消すと動いた

Screen Shot 2020-08-19 at 17.13.29.png

OS(Sizeに応じて)出し分けたい

readable width などは無さそう、自前でmaxWidthを設定する必要がありそう

iPadの設定アプリなどのTableViewを見ると項目が画面幅最大まで広がらず、適度な大きさにとどまる様になっています。
この設定は readableContentGuide として主にTableViewなどで利用されています。

SwiftUIに上記の様な仕組みがあるか、確認したが見当たらなかった。
いずれは追加されるかもしれないが、一時的な解決策としてViewに対してmaxWidthを設定するようにしました。

幅の参考値としてiOSでの読みやすい幅を読んだところ、サイズに関わらず672が設定されるケースが多かったためその値を採用しました。

iPhoneで回転せず、iPadでのみ回転させたい

こちらは想定通りでは有りませんがWorkaround的に動いているので記載します。正しい解決方法など有りましたコメントいただけますとありがたいです。

やはり必要だったAppDelegateファイルを再度用意し、回転動作を縦画面(.portrait)に固定します。

AppDelegate.swift
class AppDelegate: NSObject, UIApplicationDelegate {

  private static var orientationLock = UIInterfaceOrientationMask.portrait

  func application(_ application: UIApplication,
                   supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    AppDelegate.orientationLock
  }
}

次に、AppファイルにAppDelegateを結びつけます

HogeApp.swift
@main
struct HogeApp: App {
  @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
  /* ... */ 
}

現状(Xcode 12)はこの設定がiOSでしか有効にならず、iPadOSでは無視され回転してしまいます。
目的は達成されているので、一旦このままにします。

最後に

目に見える範囲だけ対応しましたので、他に懸念などお気づきの点があれば指摘、コメントお願い致します。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?