iPhone Duo의 자세별 size class 정리
Size classes on iPhone Duo
핵심 요약
- 접힌 상태의 외부 디스플레이는 세로에서 compact·regular, 가로에서 compact·compact이며, 펼친 상태의 내부 디스플레이는 모든 방향에서 regular·regular를 제공한다.
- 반쯤 펼친 상태와 완전히 펼친 상태는 size class와 화면 크기가 같으므로, size class만으로는 힌지의 접힘 정도를 구분할 수 없다.
- SwiftUI와 UIKit에서 가로·세로 size class를 읽을 수 있으며, ArrangementView 내부에서는 분할 방향에 해당하는 축의 size class가 compact로 바뀐다.
도입
iPhone Duo는 접었을 때 사용하는 외부 디스플레이와 반쯤 펼치거나 완전히 펼쳐 사용하는 내부 디스플레이를 제공한다. iOS 27.1 시뮬레이터에서 측정한 각 자세와 방향의 size class를 보면 외부 화면은 iPhone 레이아웃에, 내부 화면은 iPad 레이아웃에 대응한다. 다만 size class는 힌지 각도를 나타내지 않는다.
상세 요약
자세와 방향별 size class
측정값은 iOS 27.1 iPhone Duo 시뮬레이터에서 확인한 창 크기이며, 가로·세로 size class 순서로 정리했다.
| 자세 | 방향 | 가로 | 세로 | 크기(포인트) |
|---|---|---|---|---|
| 접힘 | 세로 | Compact | Regular | 466 × 678 |
| 접힘 | 가로 | Compact | Compact | 678 × 466 |
| 반쯤 펼침 | 세로 | Regular | Regular | 669 × 951 |
| 반쯤 펼침 | 가로 | Regular | Regular | 951 × 669 |
| 펼침 | 세로 | Regular | Regular | 669 × 951 |
| 펼침 | 가로 | Regular | Regular | 951 × 669 |
외부 디스플레이는 세로 방향에서 가로 size class가 compact이고 세로 size class가 regular다. 가로 방향에서는 두 축 모두 compact다. 이는 대부분의 iPhone에서 나타나는 size class와 같다. 내부 디스플레이는 반쯤 펼쳤을 때와 완전히 펼쳤을 때 모두 두 축이 regular다.
접힘 여부는 size class로 알 수 없다
반쯤 펼친 상태와 완전히 펼친 상태는 같은 방향에서 화면 크기와 size class가 동일하다. 따라서 size class만 확인해서는 힌지의 접힘 정도를 판별할 수 없다. 창의 size class를 기준으로 레이아웃을 바꾸는 앱은 외부 디스플레이에서 iPhone용 레이아웃을, 내부 디스플레이에서 iPad용 레이아웃을 사용하게 된다. iPhone Duo에 맞춰 레이아웃을 조정하는 내용은 iPhone Duo에 맞춰 SwiftUI 앱 레이아웃 조정하기에서도 다룬다.
SwiftUI와 UIKit에서 읽기
SwiftUI에서는 환경 값으로 가로·세로 size class를 각각 읽는다.
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@Environment(\.verticalSizeClass) private var verticalSizeClass
예를 들어 두 값이 모두 .compact인지 확인해 조건부로 처리할 수 있다. UIKit에서는 traitCollection.horizontalSizeClass와 traitCollection.verticalSizeClass를 사용한다.
ArrangementView 안의 size class
위 표는 창 전체의 size class를 나타낸다. ArrangementView 내부에서는 분할된 pane에 포함된 뷰의 size class가 달라진다. 뷰를 좌우로 나란히 배치하면 가로 축이 compact가 되고, 위아래로 쌓으면 세로 축이 compact가 된다. 나머지 축은 창의 size class를 유지한다.
예를 들어 접힌 세로 화면의 창은 가로 compact, 세로 regular다. 이 상태에서 ArrangementView가 두 뷰를 세로로 쌓으면 각 pane 안의 뷰는 두 축 모두 compact를 읽는다. 반면 iOS 27.1에서는 ArrangementView에 직접 전달한 뷰가 창의 size class를 읽고, pane 안의 뷰만 pane 기준 size class를 받는다. 디스플레이 자체의 size class가 필요하면 값을 ArrangementView 바깥에서 읽어야 한다. ArrangementView 분할 비율 설정도 관련 내용을 다룬다.
결론
기존 앱이 size class에 따라 레이아웃을 전환한다면 외부 화면에는 compact 중심의 iPhone 레이아웃을, 내부 화면에는 regular·regular 환경의 iPad 레이아웃을 적용할 수 있다. ArrangementView를 사용하면 창의 size class와 각 pane 내부 뷰의 size class가 달라질 수 있다. 디스플레이의 size class가 필요하면 ArrangementView 바깥에서 읽어야 한다.