ArrangementView 내부 뷰의 size class 읽기
Size classes inside ArrangementView
핵심 요약
- ArrangementView에서 분할된 축의 size class는 compact가 되지만, iOS 27.1에서는 직접 전달한 최상위 뷰만 pane이 아닌 window의 size class를 읽는다.
- iOS 27.1에서는 PaneView를 VStack 같은 컨테이너 안에 넣으면 pane의 size class를 읽을 수 있으며, iOS 27.2에서는 최상위 뷰와 내부 뷰의 값이 일치한다.
- iOS 27.2의 iPhone Duo와 iPad 측정 결과에서 세로로 쌓인 pane은 Regular / Compact, 가로로 나란한 pane은 Compact / Regular를 읽는다.
도입
ArrangementView 내부 pane의 size class는 분할 방향에 따라 달라진다. 가로로 나란히 배치하면 width가 Compact, 세로로 쌓으면 height가 Compact가 된다. 다만 iOS 27.1에서는 ArrangementView에 직접 전달한 최상위 뷰가 pane의 크기와 관계없이 window의 size class를 읽었다. 내부 자식 뷰는 pane에 맞는 값을 읽어, 같은 pane 안에서 결과가 달라졌다.
상세 요약
ArrangementView 최상위 뷰에서 발생한 차이
ArrangementView의 pane은 분할된 축에서 Compact size class를 읽는다. 가로로 나란히 배치된 pane은 Compact width, 세로로 쌓인 pane은 Compact height를 갖는다. 그러나 iOS 27.1에서 ArrangementView에 직접 전달한 뷰는 pane의 크기가 아니라 window의 size class를 읽었다.
실험에서는 반쯤 펼친 iPhone Duo의 가로 배치에서 폭이 371포인트인 Secondary pane도 Regular width를 보고했다. 세로 배치에서는 높이가 373포인트와 421포인트인 pane들이 Regular height를 읽었다. 반면 pane 안에 둔 자식 뷰는 분할 방향에 맞춰 Compact 값을 읽었다. 따라서 최상위 뷰와 그 내부 뷰의 size class가 서로 달랐다.
iOS 버전에 따른 동작
- iOS 27.1: ArrangementView에 직접 전달한 최상위 뷰는 window의 size class를 읽는다. 그 아래의 뷰는 pane의 size class를 읽는다.
- iOS 27.2: 최상위 뷰도 내부 뷰와 동일하게 pane의 size class를 읽는다.
최상위 뷰 여부를 확인하기 위해 PaneView를 VStack으로 한 단계 감싸자, iOS 27.1에서도 PaneView가 Compact / Regular 값을 읽었다. 글 작성자는 이 동작을 iOS 27.1의 버그로 판단했으며, Apple의 iOS 27.2 및 Xcode 27.2 릴리스 노트에서는 관련 내용을 찾지 못했다고 밝혔다.
iOS 27.1의 우회 방법
pane의 size class가 필요하다면 ArrangementView에 전달하는 뷰 내부에서 직접 읽지 말고, 해당 뷰를 컨테이너 안에 둔다.
ArrangementView {
VStack {
PaneView()
}
} secondary: {
VStack {
PaneView()
}
}
window의 size class가 필요한 경우에는 ArrangementView 바깥에서 값을 읽은 뒤 pane에 전달한다. 이렇게 하면 pane 내부의 환경 값과 window 값을 구분해 사용할 수 있다.
iOS 27.2 측정 결과
iPhone Duo Simulator에서 측정한 pane의 size class는 배치 방향과 일치했다.
| 자세와 배치 | pane 크기(포인트) | 가로 / 세로 size class |
|---|---|---|
| 접힘, 세로, 세로로 쌓임 | 각각 382 × 322 | Compact / Compact |
| 접힘, 가로, 첫 번째 뷰만 표시 | 594 × 432 | Compact / Compact |
| 반쯤 펼침, 세로, 세로로 쌓임 | 669 × 373, 669 × 421 | Regular / Compact |
| 반쯤 펼침, 가로, 나란히 배치 | 455 × 635, 371 × 635 | Compact / Regular |
| 펼침, 세로, 세로로 쌓임 | 각각 669 × 417 | Regular / Compact |
| 펼침, 가로, 나란히 배치 | 각각 433 × 635 | Compact / Regular |
UIKit에서도 pane 내부의 UIView, UIViewController, UIHostingController가 SwiftUI 뷰와 같은 값을 읽었다. iPad Pro 13인치(M5)를 전체 화면으로 사용한 iOS 27.2 측정에서도 세로 배치는 Regular / Compact, 가로 배치는 Compact / Regular였다. 글은 펼친 iPhone Duo에서도 같은 방향별 size class를 얻는다고 설명한다. 자세별 iPhone Duo 측정은 iPhone Duo의 자세별 size class 정리에서 확인할 수 있다.
결론
iOS 27.1에서 pane의 size class를 사용하려면 읽기 코드를 최상위 뷰 안쪽의 컨테이너 아래에 둔다. 예를 들어 PaneView를 VStack으로 감싸면 PaneView는 분할 축의 Compact 값을 읽는다. iOS 27.2에서는 최상위 뷰도 내부 뷰와 같은 값을 읽는다. 반대로 window의 size class가 필요하면 ArrangementView 바깥에서 읽어 pane에 전달한다.