iPhone Duo App Layout Redesign: What Breaks and How to Fix It in SwiftUI, UIKit, Flutter, React Native and Unity

iPhone Duo App Layout Redesign: What Breaks and How to Fix It in SwiftUI, UIKit, Flutter, React Native and Unity
Posted on12 September 2026

If your iOS app was built with anything older than the iOS 27 SDK, it will run letterboxed on the iPhone Duo's inner screen on 23 October.

Not broken. Just small, centred, with black bars around it. On a $1,999 phone.

That is the default. Most apps in the App Store will look like that on launch day.

The fix is not one flag. Apple's guidance is five changes, and the order matters. Here is that order, with the SwiftUI, UIKit and cross platform versions of each one.

What the Duo is, from a layout point of view

Two screens. A 5.4 inch outer screen and a 7.6 inch inner screen. Both have the same aspect ratio, so content scales proportionally when you open it. A20 Pro chip. iOS 27.1 at launch.

The number that matters is not the diagonal. It is the size class.

DisplayHorizontal size classVertical size classFeels like
Outer, 5.4 inch, portraitcompactregulara normal iPhone
Inner, 7.6 inchregularregularan iPad mini

Your app keeps the iPhone idiom on both screens. But on the inner screen it gets iPad sized space. Every layout decision that asks "is this an iPhone?" is now wrong there.

Step 1. Rebuild against the iOS 27.1 SDK

This is the whole difference between letterboxed and edge to edge.

Rebuild with the iOS 27 SDK and your content reaches the edges of the inner display. iOS 27.1 also turns on the vertical toolbar layout the Duo uses when open.

No code change. One build. Ship this first, even if nothing else is ready.

Step 2. Stop asking about orientation. Ask about size class

Apple's own words: the inner display doesn't honor your supported interface orientations.

Any branch on UIDevice.current.orientation or supportedInterfaceOrientations returns an answer the inner screen ignores.

SwiftUI

@Environment(\.horizontalSizeClass) private var hSize

var body: some View {
    if hSize == .regular {
        NavigationSplitView { Sidebar() } detail: { Detail() }   // inner display
    } else {
        NavigationStack { List() }                                // outer display
    }
}

UIKit. Read traitCollection.horizontalSizeClass, never UIScreen.main.bounds. UIScreen.main is deprecated here because there are two screens. Use view.window?.windowScene?.screen instead.

Step 3. Safe areas are no longer symmetric

Left and right insets can differ. Code that reads the left inset and mirrors it to the right will misplace content on one side.

Read each inset separately. In UIKit, use inset(by:) with the real UIEdgeInsets.

The fold and the under display camera are both exposed as reserved regions:

GeometryReader { proxy in
    let fold = proxy.reservedRegions(.division)     // the hinge, when partly folded
    let cam  = proxy.reservedRegions(.occlusion)    // the under display camera
}

Standard containers handle these for you. NavigationStack, TabView, List, system sheets and alerts all avoid them. Custom full screen canvases, games and video players do not. If you draw your own UI, you have to read them yourself.

Step 4. Use the two pane container instead of building one

iOS 27.1 adds ArrangementView in SwiftUI and UIArrangementViewController in UIKit. You give it a primary and a secondary view, and the system splits or stacks them around the fold.

ArrangementView { PlayerView() } secondary: { UpNextView() }
    .arrangementViewStyle(.split.axes(.horizontal))

NavigationSplitView and UISplitViewController already adapt on their own. If you hand rolled a master detail layout with a GeometryReader and a width threshold, replace it now.

Step 5. Hinge angle is for effects, not layout

onHingeChange in SwiftUI and UIHingeInteraction in UIKit report closed, partly open or fully open, plus a continuous angle.

Apple is explicit. Use it for interactions and effects. Do not use it to decide layout. Layout comes from size classes and reserved regions.

A camera app that turns the bottom half into a shutter grip when the phone is half folded is the intended use. A news app that changes its column count based on angle is a bug waiting to happen.

Not native? Flutter, React Native, KMP, Unity, MAUI, web wrappers

The Duo is an iOS device, so every framework inherits the same baseline. Rebuild against the iOS 27.1 SDK in Xcode 27.1 or you ship letterboxed. That part is free.

What differs is how much of steps 2 to 5 each framework can express.

FrameworkResize and size classAsymmetric safe areasFold and hingeVendor guidance as of 12 Sep 2026
FlutterLayoutBuilder and MediaQuery.sizeOf workMediaQuery.paddingOf(context).left and .right separately, worksdisplayFeatures is Android only. Empty on the Duonone. Proposal flutter/flutter #192515 is open
React NativeuseWindowDimensions worksuseSafeAreaInsets per edge, worksno fold API at allnone
Kotlin Multiplatform / Compose MPwindow size classes work on iOSWindowInsets per side, worksno hinge API on the iOS targetnone published
Unity and game enginesdo not cache the safe rect at launchread the safe area every framenothing built in. A full screen Metal view draws straight across the fold and the cameranone published
.NET MAUITwoPaneView is a responsive split on iOS, not fold awareper edge insets workAndroid only Foldable NuGetnone for the Duo
Capacitor, Cordova, PWAresponsive CSS worksenv(safe-area-inset-*) per side, worksweb content cannot see the foldnone. A cordova-ios request is open

Three rules follow from that table.

One. Stop caching dimensions. Every framework that breaks on the Duo breaks the same way. A screen size read once at startup and reused. Flutter apps that save MediaQuery.of(context).size in initState. React Native apps calling Dimensions.get('window') outside a hook. Unity scripts reading Screen.safeArea in Awake. The Duo changes size while your app is running, several times a day. Read it where you lay out, every time.

Two. Treat left and right as different numbers. Asymmetric safe areas are new on iPhone. Any helper that works out one horizontal inset and applies it to both sides will be wrong on one side. Search your code for .horizontal shorthands.

Three. For the fold you have two honest options. Write a small platform channel or native module that wraps reservedRegions and onHingeChange and passes the rects to your framework. That is about a day for a competent iOS developer. Or accept a fold unaware layout that is still correct: one column checkout, nothing critical pinned to the exact centre, standard containers wherever you can.

What you cannot do is assume the framework will handle it. Today, none of them do.

Games have it worst. A Unity or SDL view is one full screen surface. Rebuilt on the 27.1 SDK it fills the inner display edge to edge, including the strip under the fold and the camera cut out. Nothing stops you drawing the pause button there. Until an engine ships a reserved region query, treat the horizontal and vertical centre lines as a no go zone for anything tappable. Keep the HUD in the corners.

Test it before 23 October

Xcode 27.1 ships an iPhone Duo simulator with fold, rotate and pose controls. It also has an App Resizability check that flags layouts which cannot adapt.

Run it in all four poses. Closed portrait, closed landscape, open vertical, open horizontal. Then run it while folding. That transition is where state gets lost.

What this actually costs

AppStepsTypical effort
Standard SwiftUI app using NavigationStack and List1 and 21 to 2 days
UIKit app with custom layouts and UIScreen.main1, 2 and 31 to 2 weeks
Game, video or canvas app drawing full screenall five2 to 4 weeks
Flutter, React Native or KMP app with cached screen sizes1, 2 and 3, plus a native bridge if you need the fold3 to 7 days
Unity or engine game1, then hand placed HUD and a safe rect read each frame1 to 2 weeks

Most of this is not Duo specific. It is the adaptive layout work you should have done for iPad and never did. Now there is a $1,999 device making it visible.

Not a developer and just need to know what to ask? Read the owner's version: I Own an App but I'm Not a Developer.

Need it done before launch day?

We build and repair iOS and Flutter apps for founders who want a fixed price and a date, not a discovery call.

A Duo readiness review takes two working days. We run your build in the Duo simulator across all four poses, list every letterbox, clipped safe area and hinge collision, and price the fix. Paid through Upwork, so the money moves when it passes.

Get your app Duo-ready before 23 October
Teamz Lab · fixed price · paid through Upwork

We run your build in the iPhone Duo simulator across all four poses, list every letterbox, clipped safe area and hinge collision, and quote the fix as a fixed price with a date. Two working days.

Book a Duo readiness reviewOr see our UI work →
---

Cover photo by @heyitsyogesh on X, used with credit. iPhone Duo is a trademark of Apple Inc. Teamz Lab is not affiliated with Apple.

Sources: Apple Newsroom, "Apple unveils iPhone Duo", 9 September 2026. Apple Developer Tech Talks "Prepare your app for iPhone Duo" and "Strike a pose with adaptive layouts on iPhone Duo". Flutter MediaQuery.displayFeatures documentation and flutter/flutter #192515. React Native useWindowDimensions documentation. .NET MAUI TwoPaneView documentation.