iOS 27.1에서 UIView 기본 레이아웃 마진이 0이 되었습니다
iOS 27.1 이상에서 UIView 기본 레이아웃 마진은 0입니다. 서브뷰의 기본 마진을 각 변 8포인트로 가정하고 여백을 잡아 둔 화면은 안쪽 여백이 사라진 모습으로 보입니다. 10월 23일 출시되는 아이폰 듀오가 iOS 27.1을 탑재하므로 이 변화는 새 기기에서 먼저 드러납니다. iOS 27.2가 정식 배포되면 기존 아이폰도 같은 조건이 됩니다.
애플 문서의 기본값 설명은 아직 이 변화를 반영하지 않았습니다. 이 글에서는 릴리스 노트 원문과 오늘 직접 받은 문서 페이지를 대조해 무엇이 바뀌었는지 확인합니다. 어느 화면부터 손대야 하는지 순서도 함께 잡습니다.
릴리스 노트에 적힌 변경 내용
애플 iOS·iPadOS 27.2 베타 릴리스 노트의 UIKit 새 기능 항목에는 이렇게 적혀 있습니다.
On iOS 27.1 and later, the default layout margins for a UIView are zero. A view controller continues to provide its view with systemMinimumLayoutMargins, which vary depending on the presentation context. To inherit these margins in a subview of the view controller's view, set its preservesSuperviewLayoutMargins property to true. (186294594)
문장을 나눠 읽으면 적용 범위가 세 갈래로 갈립니다.
- 서브뷰의 기본 마진은 0입니다.
- 뷰 컨트롤러의 루트 뷰는 계속 systemMinimumLayoutMargins를 받습니다. 표현 방식에 따라 값이 달라집니다.
- 루트 뷰의 마진을 서브뷰까지 이어받으려면 서브뷰의 preservesSuperviewLayoutMargins를 true로 설정합니다.
이 항목은 UIKit의 새 기능(New Features) 목록에 들어 있습니다. 버그 목록에 있지 않으므로 되돌아오기를 기다릴 성질의 변경이 아닙니다. 화면 쪽을 맞추는 편이 순서입니다.
애플 문서에서 '8포인트' 문장은 사라졌습니다
2026년 10월 16일에 layoutMargins 문서와 directionalLayoutMargins 문서를 데이터 엔드포인트로 받아 확인했습니다. 두 페이지 모두 서브뷰 기본값이 몇 포인트인지 적지 않습니다. 안전 영역을 벗어나거나 preservesSuperviewLayoutMargins가 true일 때 값이 커질 수 있다는 단서만 남아 있습니다.
같은 파일의 2026년 4월 11일 사본에는 다음 문장이 있었습니다.
For other subviews in your view hierarchy, the default layout margins are normally 8 points on each side, but the values may be greater if the view is not fully inside the safe area or if the preservesSuperviewLayoutMargins property is true.
애플이 운영하는 Auto Layout 가이드 아카이브도 같은 값을 적어 둡니다. "The default margins are 8 points on each side. You can modify these margins based on your app's needs."
문장이 사라진 것은 직접 확인할 수 있습니다. 아래 명령은 오늘 기준으로 아무것도 출력하지 않습니다.
curl -s "https://developer.apple.com/tutorials/data/documentation/uikit/uiview/layoutmargins.json" \
| grep -o "normally 8 points on each side"
기본 마진 값을 문서 페이지에서 확인하는 방법은 이번 변경에는 통하지 않습니다.
루트 뷰는 그대로, 서브뷰만 0입니다
표로 나눠 두면 헷갈리지 않습니다.
| 대상 | 이전 | iOS 27.1 이상 |
|---|---|---|
| 뷰 컨트롤러 루트 뷰 좌우 | 표현 방식에 따라 16~20포인트 | 그대로 |
| 뷰 컨트롤러 루트 뷰 상하 | 0포인트로 관리 | 그대로 |
| 일반 서브뷰 | 각 변 8포인트 | 0 |
| 서브뷰에 코드로 지정한 마진 | 지정한 값 | 지정한 값 |
systemMinimumLayoutMargins 문서는 이 값이 루트 뷰의 서브뷰 마진에는 영향을 주지 않는다고 밝힙니다. "This property does not affect the margins associated with subviews of the root view." 그래서 루트 뷰 마진만 보고 있으면 서브뷰가 0이 된 사실을 알아채기 어렵습니다.
뷰 컨트롤러의 viewRespectsSystemMinimumLayoutMargins는 기본값이 true입니다. 루트 뷰 마진을 직접 지정하는 화면은 이 최소값과 비교해 큰 쪽을 씁니다. 그래서 이번 변경과 무관하게 값을 유지합니다.
어느 화면이 영향을 받나요
아래 네 가지에 해당하면 우선 확인 대상입니다.
- 코드에서 서브뷰의 layoutMarginsGuide나 directionalLayoutMargins를 기준으로 제약을 건 곳
- 인터페이스 빌더에서 Constrain to margins를 켠 채로 만든 제약. 애플 Auto Layout 가이드는 컨트롤 드래그로 만드는 제약이 기본적으로 마진 기준이라고 설명합니다.
- UIStackView에서 isLayoutMarginsRelativeArrangement를 true로 두고 마진 값을 따로 지정하지 않은 곳. 스택 뷰도 UIView이므로 같은 기본값을 따릅니다.
- 커스텀 테이블·컬렉션 셀에서 contentView의 마진 가이드를 기준으로 잡은 제약
safeAreaLayoutGuide만 쓰거나 상수를 직접 지정한 화면, 루트 뷰의 마진 가이드를 쓰는 화면은 값이 그대로입니다. 마진에 기대지 않은 화면까지 다시 손댈 필요는 없습니다.
iOS 27.1 SDK로 빌드하지 않아도 바뀔 수 있습니다
릴리스 노트는 "On iOS 27.1 and later"라고만 적고 SDK 링크 조건을 달지 않았습니다. 애플은 SDK 조건이 필요한 항목에는 "When linked on iOS 27, tvOS 27, macCatalyst 27, or visionOS 27 SDKs"처럼 따로 표시합니다. 그래서 Xcode 26이나 Xcode 27.0으로 빌드해 이미 올려 둔 앱도 iOS 27.1 기기에서는 서브뷰 마진이 0인 상태로 실행될 수 있습니다.
빌드 도구 일정과는 분리해서 보는 편이 좋습니다. Xcode 27.1 정식은 미국 태평양시각 2026년 10월 15일(한국시간 10월 16일 새벽)에 공개되었습니다. iOS 27.1 SDK와 아이폰 듀오 개발 지원이 여기에 들어 있습니다. 코드를 고칠 때까지 배포를 미루는 결정과 여백이 달라지는지 확인하는 일은 서로 다른 문제입니다.
확인은 같은 빌드를 두 런타임에서 실행해 마진 값을 비교하는 방식이 가장 빠릅니다.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// container는 뷰 컨트롤러 루트 뷰의 서브뷰입니다.
print("root", view.directionalLayoutMargins)
print("child", container.directionalLayoutMargins,
"preserves", container.preservesSuperviewLayoutMargins)
}
child의 leading이 8에서 0으로 바뀌면 이 글이 다룬 변경이 그 화면에 적용된 상태입니다. iOS 27.0 시뮬레이터와 iOS 27.1 또는 27.2 시뮬레이터에서 같은 로그를 나란히 찍어 비교합니다. 로그를 넣기 어려운 화면은 Xcode의 View Debugger에서 레이아웃 가이드를 켜고 보면 됩니다.
고치는 방법 세 가지와 선택 기준
1. 서브뷰가 상위 뷰 마진을 따르게 합니다. 애플이 릴리스 노트에서 안내한 방법입니다.
final class CardView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
preservesSuperviewLayoutMargins = true
}
required init?(coder: NSCoder) {
super.init(coder: coder)
preservesSuperviewLayoutMargins = true
}
}
이때 값은 이전 8포인트가 아니라 상위 뷰의 마진입니다. 루트 뷰 바로 아래라면 좌우 16~20포인트가 되므로 픽셀 단위로 같아지는 수정이 아닙니다.
2. 기존 8포인트를 그대로 유지해야 하면 값을 직접 지정합니다.
container.directionalLayoutMargins = NSDirectionalEdgeInsets(
top: 8, leading: 8, bottom: 8, trailing: 8)
왼쪽·오른쪽 대신 leading과 trailing을 쓰면 오른쪽에서 왼쪽으로 읽는 언어에서도 같은 여백이 유지됩니다.
3. 이미 루트 뷰 마진에 맞춰 둔 컨테이너가 있다면 안쪽 뷰를 컨테이너 기준으로 다시 잡습니다. 서브뷰마다 마진을 되살리는 것보다 여백의 출처를 한 곳으로 모으는 편이 다음 변경에 덜 흔들립니다.
어느 쪽을 고를지는 지금 보이는 8포인트가 디자인 값이었는지로 갈립니다. 여백이 사라졌다는 이유만으로 1번을 적용하면 좌우 여백이 8포인트에서 16~20포인트로 늘어난 화면이 생깁니다. 디자인 값이었다면 2번, 상위 여백을 따르는 것이 의도였다면 1번입니다.
언제까지 손봐야 하나요
- 2026년 10월 16일: 아이폰 듀오 사전 주문 시작
- 2026년 10월 23일: 아이폰 듀오 출시, iOS 27.1 탑재
- 2026년 10월 13일(태평양시각): iOS 27.2 베타 4 배포, 이 릴리스 노트에 이번 항목이 실림
- iOS 27.2 정식 배포 시: 기존 아이폰도 서브뷰 기본 마진 0
듀오를 지원하지 않는 앱도 예외가 아닙니다. iOS 27.2가 정식 배포되면 같은 조건이 기존 아이폰에 적용됩니다. 새 기기 대응 일정과 별개로 마진에 의존하는 화면 목록을 미리 뽑아 두는 편이 좋습니다. 사용자에게 자주 보이는 목록 셀과 카드, 커스텀 헤더부터 보는 순서가 효율적입니다.
배포 전에 확인할 항목
- 서브뷰의 layoutMarginsGuide로 제약을 건 화면 목록
- 인터페이스 빌더의 Constrain to margins 제약
- UIStackView의 isLayoutMarginsRelativeArrangement와 마진 값
- iOS 27.0과 iOS 27.1 이상 시뮬레이터에서 같은 화면 비교
- 마진을 되살린 화면의 값이 이전과 같은지 여부
출처와 원문 링크
- iOS & iPadOS 27.2 릴리스 노트 (UIKit 새 기능, 186294594)
- Xcode 27.1 릴리스 노트
- UIView.layoutMargins, UIView.directionalLayoutMargins, UIView.preservesSuperviewLayoutMargins
- UIViewController.systemMinimumLayoutMargins, UIViewController.viewRespectsSystemMinimumLayoutMargins
- Auto Layout 가이드 아카이브: Working with Constraints in Interface Builder
- Prepare and submit your apps for iPhone Duo (2026년 10월 5일)
- 애플 문서 오프라인 사본 layoutMargins (2026년 4월 11일)
- 내부 글: iOS 27.1 아이폰 듀오 앱 대응: 화면이 좁게 나오는 이유와 10월 23일 전 점검
'iOS' 카테고리의 다른 글
| pbxproj 충돌 대신 Xcode 27.2 .xcproj: pod install이 멈추는 이유와 전환 순서 (0) | 2026.10.20 |
|---|---|
| Xcode 27.1 Mac Catalyst 컴파일 오류: iOS 27.1 API가 없는 이유와 최소 수정 (0) | 2026.10.17 |
| Apple HomeView(애플 홈뷰) 위젯 노출: 10월 13일 계약 개정과 제외 설정 (0) | 2026.10.15 |
| 아이폰 듀오 앱 스크린샷: 내부 2007×2853·외부 1398×2034와 2027년 4월 의무화 (0) | 2026.10.14 |
| Xcode 27 SwiftUI 컴파일 오류: 결과 빌더 통합 뒤 ambiguous use 5가지와 최소 수정 (0) | 2026.10.13 |