LayoutProvider
앱 창의 크기·크기 클래스·가독 폭·접힘선·기기 자세를 하위 컴포넌트에 공급하는 Provider입니다. 앱 루트에 한 번 둡니다.
| 플랫폼 | 창 크기·크기 클래스 | 접힘선·가림 영역 |
|---|---|---|
| iOS | 관찰 뷰의 bounds·size class trait | reserved region(아이폰 듀오) |
| Android | androidx.window WindowSizeClass | Jetpack WindowManager FoldingFeature |
힌지 상태·각도는 두 플랫폼 모두 expo-hinge로 읽습니다. 기기 이름이나 화면 비율로 추측하지 않습니다.
기본 사용법
SafeAreaProvider 안쪽, ThemeProvider 바깥쪽에 둡니다. 루트 레이아웃 코드는 시작하기에 있습니다.
ZSScreen·ZSKeyboardStickyView(가독 폭), ZSPaneLayout(분할·접힘선), ZSTabNavigator(Android 바 ↔ 레일)가 이 값을 읽습니다. 시트·메뉴의 넓은 창 배치와 접힘선 회피는 시스템이 맡습니다. Alert는 zs-ui가 창 가운데에 그립니다.
LayoutProvider 밖에서 useWindowLayout·useDisplayFeatures·useDevicePosture·useBarAxis나 이 값을 쓰는 컴포넌트를 쓰면 에러(… must be used within a LayoutProvider)를 던집니다.
Props — LayoutProviderProps
| Prop | Type | Default | 설명 |
|---|---|---|---|
readableMaxWidth | ReadableMaxWidth | 'system' | 가독 폭('system' | number). 화면이 maxContentWidth="readable"을 고를 때만 씁니다 — 기본은 전폭이라 쓰지 않습니다 |
barAxis | BarAxis | 'vertical' | 바 배치('vertical' | 'horizontal'). 아래 바 배치를 보세요 |
children | ReactNode | Required | 앱 |
readableMaxWidth | iOS | Android |
|---|---|---|
'system' | 관찰 뷰의 readableContentGuide 폭 — 글자 크기 설정이 커지면 넓어집니다. 첫 측정 전에는 640입니다 | 640(Material 3 시트 최대 폭) |
| 숫자 | 그 값 | 그 값 |
compact 창에는 적용하지 않습니다. 넓은 창 폭 규칙은 ZSScreen을 보세요.
LayoutProviderProps·ReadableMaxWidth·BarAxis 타입을 내보냅니다.
바 배치 — barAxis
상태바·내비게이션 바·탭 바를 세로 바에 둘지, 위아래 가로 바에 둘지 정합니다. 앱 단위로 한 번 정합니다.
<LayoutProvider barAxis="horizontal">{children}</LayoutProvider>
barAxis | iOS | Android |
|---|---|---|
'vertical' | 시스템이 정합니다. 아이폰 듀오는 접힌 화면과 펼친 가로 화면에서 상태바·헤더 버튼·탭 바를 끝 쪽 세로 바에 둡니다 | ZSTabNavigator 기본 규칙 — 폴더블 펼침·태블릿은 레일 |
'horizontal' | 세로 바를 끕니다. 상태바·내비게이션 바는 위로, 탭 바는 아래로 가고 세로 바 쪽 safe area inset이 없어집니다 | ZSTabNavigator가 모든 폭에서 하단 바를 씁니다(폴더블 펼침·태블릿 포함) |
- iOS는
expo-status-bar의StatusBar.setVerticalBarBehaviorIOS로 적용합니다. 화면에<StatusBar verticalBarBehaviorIOS="…" />를 따로 두면 그 값이 앞섭니다. - iOS 세로 바는 iOS 27.1 이상에서 iOS 27.1 SDK(Xcode 27.1)로 빌드한 앱에만 있습니다. 세로 바가 없는 기기에서는 두 값이 같습니다. 세로 바가 놓이는 쪽(시작·끝)은
expo-status-bar