← Back to list

WWDC26 for UIKit App Developers — Adaptivity

Quick brief for Adaptivity changes for UIKit based app mentioned from Modernize your UIKit app session

Daegun Choi · 2026-06-30 12:38 · 0 claps · 3.1 min read
#ios #wwdc #uikit #ios-development #developer
Open on Medium ↗
Wiki topics: 📱 · Mobile Development

WWDC26 for UIKit App Developers — Adaptivity

Quick brief for Adaptivity changes for UIKit based app mentioned from Modernize your UIKit app session

한국어 독자시라면, 이 링크로 가주세요.

The “What’s new in UIKit” session is gone…! 😱

Instead, Modernize your UIKit app seems to be taking its place.

In that session, Apple talks about how existing apps need to support adaptive UI behavior. ̶T̶h̶e̶ ̶F̶o̶l̶d̶a̶b̶l̶e̶ ̶i̶P̶h̶o̶n̶e̶ ̶i̶s̶ ̶r̶e̶a̶l̶!̶

Let’s quickly go over what kind of adaptivity Apple is asking for, and what we actually need to do.

Adaptivity

On macOS 27, when you use iPhone Mirroring, the app window can be resized. The same applies to iPhone-only apps running on iPad.

Default size / Expanded size

Default size / Expanded size

Because of this, apps now need to dynamically adapt to the available scene size at runtime.

Changes needed for Legacy API

Changes needed for Legacy API

  • UIScene lifecycle is required starting with iOS 27.
  • ❌ Don’t use existingAppDelegate lifecycle
  • Check whether your app is using UISceneDelegate.

Transitioning to the UIKit scene-based life cycle Make your UIKit app more flexible — WWDC25

Main screen

When an iPhone app is mirrored on a Mac the screen associated with the scene can change.

There are two main patterns for handling this.

1. Avoid referencing the main screen in your app

Instead, access the screen dynamically through windowScene.

// Use local screen references
// Access the correct screen through a windowScene
let screen = window?.windowScene?.screen

// Pass in local screen references
func generateThumbnail(_ image: UIImage, screen: UIScreen) -> UIImage {
    // existing code, replacing main screen with local screen reference
    // ...
}

2. Remove screen references entirely

2.1. Use traitCollection.displayScale

Replace screen scale usage with traitCollection.displayScale, so the UI can automatically update when traits change.

// Replace the screen's scale with trait collection's displayScale
override func layoutSubviews() {
    super.layoutSubviews()

    // layoutSubviews will be called again automatically when displayScale changes
    let displayScale = traitCollection.displayScale
    // ...
}

Automatic trait tracking

When automatic trait tracking is not available, register for trait changes manually where needed.

// Manually register for trait changes
let displayScaleTrait: [UITrait] = [UITraitDisplayScale.self]

registerForTraitChanges(displayScaleTrait) {
    (view: GalleryView, previousTraitCollection: UITraitCollection) in
    view.cache.invalidate()
}

Adapting your app when traits change

2.2. Checking screen bounds

In adaptive environments, the space available to a scene is no longer always the full screen bounds. (i.e. iPhone Mirroring or Split View on iPadOS.)

So, references to screen bounds should be removed.

UIWindowScene.effectiveGeometry provides information about the space currently available to your app.

Monitoring effectiveGeometry:

// UIWindowSceneDelegate
func windowScene(
    _ windowScene: UIWindowScene,
    didUpdateEffectiveGeometry previousEffectiveGeometry: UIWindowScene.Geometry
) {
    let geometry = windowScene.effectiveGeometry
    let availableSpace = geometry.coordinateSpace.bounds
    // ...
}

Instead of using the scene’s bounds, use the view’s bounds.

// Checking available space
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let availableSpace = view.bounds.size
    // ...
}

UIRequiresFullScreen

The previously supported UIRequiresFullScreen behavior will be deprecated for iOS 27 or later

User interface idiom

Even if UIUserInterfaceIdiom returns phone, you can no longer be completely sure whether the app is actually running:

  1. on a real iPhone,
  2. on an iPad,
  3. or through iPhone Mirroring on a Mac.

Because of this, you should avoid using UIUserInterfaceIdiom for layout decisions.

Interface orientation

  • In resizable environments, the old Interface Orientation value is ignored.
  • In iPhone Mirroring, the app is always treated as Portrait.
  • Use size classes and scene bounds instead.

Device rotation is just an animated bounds change. — Bruce Nilo, WWDC2014

Testing

Testing

Agentic coding

Agentic coding

Xcode 27 is said to have a deep understanding of adaptivity-related work.

It includes a skill that can automatically apply many of the changes mentioned above.

You can try it directly with Xcode Intelligence.

You can try it directly with Xcode Intelligence.

Using external Tools

You can also export this skill and import it into other agents or tools. ̶S̶e̶e̶m̶s̶ ̶l̶i̶k̶e̶ ̶A̶p̶p̶l̶e̶ ̶k̶n̶o̶w̶s̶ ̶n̶o̶b̶o̶d̶y̶ ̶u̶s̶e̶s̶ ̶X̶c̶o̶d̶e̶ ̶I̶n̶t̶e̶l̶l̶i̶g̶e̶n̶c̶e̶

xcrun agent skills export

I uploaded the exported skill files to the Xcode-27-Skills repository.

If you want to try UIKit modernization related skills, check uikit-app-modernization from this repository.


메타데이터
post_id
ef4d23b0b95b
slug
wwdc26-for-uikit-app-developers-adaptivity-ef4d23b0b95b
url
https://medium.com/@choiysapple/wwdc26-for-uikit-app-developers-adaptivity-ef4d23b0b95b
canonical_url
https://medium.com/@choiysapple/wwdc26-for-uikit-app-developers-adaptivity-ef4d23b0b95b
author_url
https://medium.com/@choiysapple
status
ok
fetched_at
2026-07-09 10:29:04