Apple states that all apps participate in side-by-side multitasking on iPhone Duo. This is not an opt-in feature, which means an app that has never been resized in its life can now be handed an arbitrary fraction of the inner display.
Why it happens
Split View changes your app’s available width without changing the device orientation and without relaunching the app. Code that computes layout once — in viewDidLoad, in initState, in a module-level constant — never learns that the width changed.
This is the same class of bug as hard-coded dimensions, but it is triggered by the user at an arbitrary moment rather than by the device, so it is easy to miss in testing.
The fix
Make layout a function of current size rather than a one-time computation.
// SwiftUI — recomputes automatically
GeometryReader { proxy in
ContentGrid(columns: proxy.size.width > 500 ? 2 : 1)
}
// UIKit — respond to trait and size changes
override func viewWillTransition(
to size: CGSize,
with coordinator: UIViewControllerTransitionCoordinator
) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate { _ in self.relayout(for: size) }
}
Apple notes that apps already supporting iPad resizing or iPhone mirroring have a head start here — the same adaptive code paths apply.
Two failure modes worth testing for specifically:
- Cached geometry. Anything stored at launch and reused later.
- Work paused on resign-active. In Split View your app can be visible but not frontmost. Timers, video, and animation stopped on
sceneWillResignActivewill look frozen to a user who can still see the window.
How to verify
In the Duo simulator, put your app side by side with another app and drag the divider through its full range. The layout should reflow continuously, and any playing content should keep playing.