【iPadの縮小ウィンドウ】sizeRestrictions minimumSize windowResizability 観測隊
iPad画面上でアプリのウインドウを小さく操作する機能についての記事です。ウィンドウの最小サイズの設定について私の観測によるものです。
環境
Sequoia 15.7.4
Xcode 26.3
シミュレータ iPad mini 7th 26.2
3つの値
登場人物は3人です。
【値A】アプリで何も設定しないときでも最小の値がある
アプリのウィンドウがあまり小さくなっても困りますんでこれ以上は小さくならないという値があります。これはOSによって決められる値です。感覚がわからない人はざっくりと初代iPhoneのサイズ(320 480)をイメージするといいでしょう。
【値B】アプリで最小サイズが設定できる
アプリ開発者が「そんなに小さくされては困る」という場合、アプリのソースコードで最小サイズを設定することができます。常識的に値Aより大きい値となるでしょう。
【値C】アプリで設定した値が大きすぎるときに対応
しかし、値Bをあまりに大きく設定すると今度はOSが管理しにくくなります。そこで、値Bの上限というものが存在し、値Bが上限を超えていると値Bが有効ではなくなります。この上限値はOSによって決められます。
値Bの設定方法の例
//UIKit
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// 最小サイズの設定
if windowScene.traitCollection.userInterfaceIdiom == .pad {
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 320, height: 568)
}
}
//SwiftUI
var body: some Scene {
WindowGroup {
ContentView()
//ステータスバーがあるなら548
.frame(minWidth: 320, minHeight: UIDevice.current.userInterfaceIdiom == .pad ? 568 : 568) //分けたい人は別の値を設定
}
.windowResizability(.contentMinSize)
}
各状況の挙動
値Aと値Cはデバイスの種類や向きの縦横によって決定します。よって、アプリ開発者としては 値Bがどこになっているか という考え方で状況を分析します。
値B < 値A < 値C のとき
値Bは無効
値A < 値B < 値C のとき
値Bは有効
値A < 値C < 値B のとき
値Bは無効。
このパターンが一番問題が起きると思う。値Bをもとに描画されたものが値Cの範囲で表示され、端のほうは表示されない。 という現象が起きる。
UIKitの view.frame.size.height で取得できるのは値C
SwiftUIの GeometryReader で取得できるのは値B(あるいは値Bから計算される値)
具体的な値
iPad mini 7th ランドスケープ(縦が短い)で
値A view.frame.size.height で取得できる値は486.0
値C view.frame.size.height で取得できる値は577.5
iPad miniの短い方がどうしてもiPhone5の縦サイズあたりで制限(値C)をかけてくる。
さいごに
縦方向のみの観測になっています。横方向の挙動が違っていたらすみません。
Discussion