본문으로 건너뛰기

iPhone Duo에서 시트 위치를 지정하는 presentationPlacement

Place a sheet on one side with presentationPlacement on iPhone Duo

sarunw.com

핵심 요약

  1. iOS 27의 SwiftUI `presentationPlacement(_:)`와 UIKit `preferredPlacement`는 펼친 iPhone Duo에서 시트를 왼쪽·가운데·오른쪽에 배치하도록 지정한다.
  2. 완전히 펼친 화면에서 `.trailing`은 시트를 세로 바 옆에 놓아 시트의 닫기·완료 버튼도 세로 컨트롤로 배치하고, `.leading`은 가로 툴바를 유지한다.
  3. 위치는 시스템 선호값이므로 반쯤 접혔을 때 시트는 힌지를 피하며, 접힌 외부 화면이나 일반 iPhone에서는 화면 너비를 채워 placement가 달라지지 않는다.

도입

일반 iPhone에서는 시트가 화면 너비를 채우지만, 펼친 iPhone Duo에서는 시트가 화면 일부만 차지한다. iOS 27은 시트의 위치를 지정하는 SwiftUI `presentationPlacement(_:)`와 UIKit `UISheetPresentationController.preferredPlacement`를 제공한다. 이 설정은 시트의 위치뿐 아니라 시트 툴바 컨트롤의 배치에도 영향을 준다.

상세 요약

API와 적용 위치

iOS 27은 시트를 화면의 어느 쪽에 놓을지 지정하는 API를 제공한다.

  • SwiftUI: presentationPlacement(_:)
  • UIKit: UISheetPresentationController.preferredPlacement

SwiftUI에서는 modifier를 시트를 여는 뷰가 아니라 시트 콘텐츠에 적용한다.

.sheet(isPresented: $showNewList) {
    NewListView()
        .presentationPlacement(.trailing)
}

지원하는 값은 네 가지다.

  • .automatic: 시스템이 위치를 결정하는 기본값
  • .leading: 화면의 leading 가장자리
  • .center: 화면 가운데
  • .trailing: 화면의 trailing 가장자리

.leading, .center, .trailing은 iOS에서만 사용할 수 있다. macOS, tvOS, watchOS, visionOS에서는 .automatic만 제공된다.

펼친 화면에서의 배치

완전히 펼친 iPhone Duo에서는 placement 차이가 가장 뚜렷하다. .automatic은 시트를 가운데에 놓고 양쪽에 앱 화면을 남긴다. .center도 같은 모습이다. .leading은 시트를 leading 가장자리로 옮긴다. 왼쪽에서 오른쪽으로 쓰는 언어 환경에서는 화면 왼쪽 가장자리다.

.trailing은 시트를 반대쪽 가장자리, 즉 세로 바가 있는 쪽에 둔다. 이때 시트의 닫기와 완료 버튼도 세로 바 안에 배치된다. 따라서 위치 설정은 툴바 모양에도 영향을 준다. 왼쪽에 둔 시트는 상단의 가로 툴바를 유지하고, 오른쪽에 둔 시트는 세로 컨트롤을 사용한다. iPhone Duo에서 세로 바를 포함한 화면 동작을 검증할 때는 iPhone Duo Simulator로 SwiftUI 앱의 레이아웃과 동작 테스트하기도 참고할 수 있다.

반쯤 접힌 화면

iPhone Duo가 반쯤 접혀 있을 때 시트는 접힌 선을 가로지르지 않는다. 시스템의 힌지 회피 동작에 따라 시트는 화면 절반을 차지한다. .automatic은 왼쪽 절반에 배치하고, .trailing은 오른쪽 절반에 배치한다. .center는 가운데가 접힌 위치와 겹치므로 중앙에 머물 수 없다. 이 경우 .automatic 및 .leading과 마찬가지로 왼쪽 절반으로 이동한다.

placement는 시스템에 전달하는 선호값이지 고정 약속이 아니다. 시스템은 시트가 힌지 위에 놓이지 않도록 우선 조정한다.

접힌 화면과 일반 iPhone

접힌 iPhone Duo의 외부 디스플레이에서는 시트가 화면을 채운다. placement는 배치에 차이를 만들지 않으며, .leading과 .trailing도 같은 모습이다. 툴바가 있는 시트의 컨트롤은 외부 디스플레이의 세로 바에 배치된다.

일반 iPhone에서도 세로와 가로 방향 모두 시트가 화면 너비를 채운다. placement에 따른 차이가 없으며, 기기 종류를 확인하지 않고 modifier를 추가해도 된다.

UIKit 설정과 제약

UIKit에서는 시트를 표시하기 전에 presentation controller의 preferredPlacement를 설정한다.

let newList = UINavigationController(
    rootViewController: NewListViewController()
)
if let sheet = newList.sheetPresentationController {
    sheet.preferredPlacement = .trailing
}
present(newList, animated: true)

UIKit에서도 .automatic, .leading, .center, .trailing을 사용한다. UIKit 헤더에 따르면 sourceView가 설정된 경우 preferredPlacement는 무시된다. 이때 시트는 source view를 기준으로 가운데에 놓인다.

선택 기준

대부분의 시트에서는 기본값인 .automatic을 사용할 수 있다. 위치가 중요한 경우에만 지정한다. 시트 동작을 앱의 다른 컨트롤처럼 세로 바에 두려면 .trailing을 선택하고, 가로 툴바를 유지하려면 .leading을 선택한다. 시트 옆에 레이아웃의 한쪽을 계속 보이게 해야 할 때도 .leading 또는 .trailing을 지정할 수 있다.

결론

위치 지정은 시트를 화면의 특정 쪽에 두고 싶을 때 사용한다. `.trailing`은 세로 바 쪽에 시트와 컨트롤을 배치하고, `.leading`은 가로 툴바를 유지한다. 다만 설정은 보장값이 아니라 선호값이다. 반쯤 접힌 화면에서는 힌지 회피가 우선하며, 접힌 외부 화면과 일반 iPhone에서는 시트가 화면을 채우므로 설정 차이가 나타나지 않는다.