Apple’s guidance is explicit: the inner display does not honor supported interface orientations.
Why it happens
Orientation locking was always a way of saying “only ever lay out at one aspect ratio”. That worked when a phone had one screen and a hinge did not exist. On iPhone Duo the user physically unfolds the device, and the app is expected to occupy the space that results. Refusing to rotate is not a meaningful answer to that, so the inner display ignores the request.
If your entire layout strategy rests on the guarantee that width is always less than height, that guarantee is gone.
The fix
Replace orientation checks with size classes, which describe the space you actually have:
// Before
if UIDevice.current.orientation.isLandscape { … }
// After — SwiftUI
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
var body: some View {
if horizontalSizeClass == .regular {
WideLayout()
} else {
NarrowLayout()
}
}
// After — UIKit
switch traitCollection.horizontalSizeClass {
case .regular: applyWideLayout()
default: applyNarrowLayout()
}
The size classes to design against are:
- Inner display — regular width × regular height, with room for a sidebar
- Outer display — compact width × regular height, familiar iPhone territory
Note that Split View multitasking changes your size class too, without any change in orientation. Size classes handle both cases with one code path; orientation handles neither.
Cross-platform stacks need the same change. In React Native, replace a cached Dimensions.get('window') with the useWindowDimensions() hook so the component re-renders on resize. In Flutter, read MediaQuery.sizeOf(context) in build rather than caching it in initState.
How to verify
Set the app to portrait-only in the target settings, then run it on the Duo inner display and rotate. The app will rotate regardless. Every layout it produces should be one you designed on purpose.