iPhone Duo Simulator로 SwiftUI 앱의 레이아웃과 동작 테스트하기
iPhone Duo Simulator: Testing and optimizing your SwiftUI app
핵심 요약
- iPhone Duo 지원의 출발점은 기기 식별이나 고정 화면 크기 분기가 아니라, SwiftUI 레이아웃이 표시 공간의 변화에 맞춰 크기와 구성을 조정하도록 만드는 것이다.
- ArrangementView, reserved regions, 세로 툴바, 힌지 반응 API는 기본 적응형 레이아웃을 대체하지 않으며, 화면별 필요에 따라 iOS 27.1에서 점진적으로 적용한다.
- Simulator는 화면 전환과 레이아웃 검증에 유용하지만 카메라, 실제 접촉 범위, 햅틱, 성능과 접히는 디스플레이 표현은 실기기에서 확인해야 한다.
도입
Xcode 27.1 베타에는 iPhone Duo Simulator가 포함되어 기기를 접고 펴거나 힌지 각도를 조절하며 SwiftUI 앱을 시험할 수 있다. iPhone Duo에서는 앱이 바깥·안쪽 디스플레이를 오가고, 회전하거나 Split View로 실행되며, 기기를 여닫는 동안 사용 가능한 공간도 달라진다. 따라서 특정 기기 여부보다 실제 레이아웃 공간에 반응하는 앱 구성이 기본이다.
상세 요약
Simulator 설치와 기본 지원
iPhone Duo Simulator를 사용하려면 Xcode 27.1을 설치한다. 설치 후에도 iOS 27.1 구성 요소의 업데이트가 필요할 수 있다. 기기는 실행 대상으로 표시되며, 하단 도구 버튼으로 접고 펼 수 있다. Option 키를 누르면 슬라이더로 힌지 각도를 조절한다.
기본 지원은 앱이 여러 크기의 공간에 맞춰 재배치되도록 만드는 것이다. 기기 식별자, 방향, 고정 화면 너비를 기준으로 분기하지 않는다. 앱이 다른 디스플레이로 이동하거나 Split View에서 실행될 때 그런 조건은 맞지 않을 수 있다. NavigationSplitView와 ViewThatFits처럼 SwiftUI가 제공하는 컨테이너와 레이아웃을 우선 사용한다. UIScreen.main.bounds 대신 SwiftUI 레이아웃 시스템, 환경 값, 컨테이너가 제공하는 공간을 기준으로 삼는다. 안전 영역과 레이아웃 여백도 확인한다. 디스플레이와 기기 자세에 따라 인셋이 좌우 대칭이 아닐 수 있다.
자세를 바꾸며 동작 확인
바깥 디스플레이에서 앱을 실행하고 여러 화면을 이동한 뒤, 시트 열기, 목록 스크롤, 항목 선택, 텍스트 입력 등을 진행한다. 앱을 실행한 상태로 기기를 펼치거나 접고, 여러 힌지 각도에서 회전과 Split View도 시험한다. 알림, 메뉴, 키보드가 표시될 때와 스크롤 가능한 콘텐츠 및 컨트롤이 접근 가능한지도 확인한다. 화면 전환 뒤 탐색과 선택 상태가 유지되어야 한다.
특히 사용자 정의 레이아웃의 고정 프레임, 오버레이, 떠 있는 버튼을 살핀다. 완전히 펼친 상태에서는 맞던 콘텐츠가 접힌 부분 아래로 들어가거나 화면 밖으로 밀릴 수 있다. 정적인 스크린샷만으로는 상태 손실, 애니메이션 중단, 뷰 위치의 일시적 이동을 발견하기 어렵다. 실제로 앱을 사용하면서 자세를 바꾸는 테스트가 필요하다.
필요한 화면에만 새 레이아웃 API 적용
iOS 27.1의 ArrangementView는 기본 영역과 보조 영역을 배치한다. 영상과 재생 목록처럼 두 영역을 함께 보여야 한다면 .split 스타일을 사용할 수 있고, 보조 영역을 기본 콘텐츠 위에 표시해야 한다면 .overlay를 선택할 수 있다. 단순히 두 열을 만든다는 이유만으로 도입할 필요는 없다. NavigationSplitView, TabView, List, ScrollView가 이미 공간에 맞춰 조정한다면 기존 컨테이너를 우선한다. 이전 iOS 버전에서는 ViewThatFits 등으로 두 영역을 계속 제공한다.
사용자 정의 전체 화면 인터페이스에서 힌지나 카메라가 중요한 콘텐츠를 가릴 수 있다면 GeometryProxy의 reservedRegions를 확인한다. .division은 안쪽 디스플레이의 접힘처럼 사용 공간을 나누는 영역이고, .occlusion은 카메라처럼 일부를 가리는 영역이다. 각 영역에는 프레임, 여백, 활성 상태가 있다. 비활성 영역은 0 크기 프레임일 수 있으므로 콘텐츠를 이동하기 전에 isActive를 확인한다. 시스템 컨테이너가 이미 접힘에 대응하는 경우에는 수동으로 콘텐츠를 옮기지 않는다.
힌지와 툴바
onHingeChange는 힌지 맥락을 관찰해 애니메이션, 아트워크 효과, 상호작용 또는 오디오를 조정하는 데 쓸 수 있다. 힌지가 제공되지 않을 수도 있으므로 효과를 초기화하고 일반 표시도 유지한다. 원시 힌지 각도로 필수 레이아웃을 결정하지 않는다. 레이아웃에는 크기 클래스, ArrangementView, reserved regions를 사용한다.
시스템 컨테이너에 연결한 툴바 항목은 세로 배치에 자동으로 대응한다. 버튼에는 제목과 아이콘을 모두 제공하고, 물리적 화면 가장자리 대신 의미에 맞는 배치를 사용한다. 사용자 정의 항목은 .horizontalOnly 또는 .verticalPreferred로 축 동작을 지정할 수 있지만 기본 자동 동작을 우선한다. 관련 iOS 27.1 API에는 이전 운영체제에서 동작할 대체 UI를 마련한다.
Simulator의 범위
Simulator에서는 레이아웃, 디스플레이 전환, 안전 영역, 세로 툴바, 힌지 각도에 반응하는 동작을 시험할 수 있다. 그러나 카메라 간 전환과 방향 기반 카메라 선택, 촬영 중 바깥 화면 표시, 접힌 자세에서의 실제 터치 접근성, 햅틱, 성능·메모리·발열, 실제 접이식 디스플레이의 표현은 검증할 수 없다. 이 항목들은 실기기 테스트 대상이다. iOS 27.1 SDK와 Simulator가 베타이므로 API와 동작은 정식 출시 전에 달라질 수 있다.
결론
먼저 시스템 컨테이너와 적응형 레이아웃으로 화면 크기 변화에 대응하고, 각 포즈에서 탐색 상태와 컨트롤 접근성이 유지되는지 확인한다. 두 사용자 정의 영역을 배치해야 할 때는 ArrangementView를, 사용자 정의 캔버스가 힌지나 카메라 영역을 피해야 할 때는 reserved regions를 검토한다. iOS 27.1 API에는 이전 버전용 대체 경로를 두고, Simulator로 재현할 수 없는 항목은 실기기에서 검증한다.