Modal Presentation in UIKit Adds Solid Background in iOS 26

Hello,

I have a number of UIViewControllers that are presented as follows:

vc.modalPresentationStyle = UIModalPresentationStyle.popover
vc.modalTransitionStyle = UIModalTransitionStyle.coverVertical
self.present(vc, animated: true, completion: nil)

The VC is designed from a Storyboard where I set the 'view' of the VC to have a .clear 'backgroundColor', I have a smaller 'Alert View' added as a subview which is what the user interacts with.

In iOS 13 - iOS 18 this would present modally, not take up the entire screen and allow the user to see relevant context from the screen underneath.

In iOS 26 Beta 5 and every beta prior the system injects a 'UIDropShadowView' in the View Hierarchy, this view has a solid color backdrop, either white/black depending on light/dark mode. This causes all underlying content to be blocked and essentially forces a full screen modal presentation despite the existing design.

I am looking for a way to remove this solid color. I'm not sure if it's intentional or a bug / oversight.

I have been able to remove it in a hacky way, I cycle the view hierarchy to find 'UIDropShadowView' and set it's backdrop to transparent. However when you swipe down to partially dismiss the view it turns to Liquid Glass when it is around 75% dismissed and then resets the background color to white/black.

I tried creating a custom UIViewControllerTransitioningDelegate so that I could re-implement the existing behaviour but it's incredibly difficult to mimic the partial dismiss swipe down effect on the VC.

I have also tried changing my presentation to:

vc.modalPresentationStyle = UIModalPresentationStyle.overFullScreen
vc.modalTransitionStyle = UIModalTransitionStyle.crossDissolve

This works but then the user loses the ability to interactively swipe to dismiss.

Any help would be appreciated. Thank you!

I believe that is an intentional behavior. As a part of the new liquid glass design, a sheet becomes opaque when its size gets large.

To present a partial modal sheet that doesn't cover the entire screen, you might consider using UISheetPresentationController, which has the detents property that allows you customize the height.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

Is this change in modal presentation documented anywhere? I can't seem to find anything on it in the Apple Dev Documentation or from WWDC25.

We don't document the implementation details, but the design change was mentioned in this video. (It is a SwiftUI video, but the design change applies to UIKit.)

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

This is a pretty awful change, as Apple hasn't defined what “large” means.

So our existing popover view controllers with translucent background suddenly start showing an opaque background when they exceed some arbitrary size? I noticed this on a popover alert which shows a transparent background running in English, but an opaque background running in German, because the latter is slightly more verbose and takes up a slightly larger amount of screen. An App should never change the presentation style just because the user's selected language is different.

Our specific scenario is presenting alerts as popovers above an Augmented Reality view. It is important to us that the user doesn't lose sight of their AR environment, which is why we want to preserve the transparent background of the popover.

Apple has a great track record for preserving backward compatibility, but this time it's broken. Even if this is the new "default" behaviour, it would really help if we could disable it programmatically for scenarios where we really do not want the OS to make such an arbitrary change in presentation.

Please consider amending the API so we can either disable or "tune" this new presentation style to preserve our existing UI appearance.

Thanks for sharing. The best way to provide feedback on the system is to start with filing a feedback report. I’d suggest that you file one with your use case and screenshots – If you do so, please share your report ID here.

Best,
——
Ziqiao Chen
 Worldwide Developer Relations.

[@Palace Software](https://developer.apple.com/forums/profile/Palace Software)

I explored this quite extensively before committing to a solution, as stated above using 'UIModalPresentationStyle.overFullScreen' and 'UIModalTransitionStyle.crossDissolve' will allow the background to stay transparent however the user loses the ability to 'swipe to dismiss' as is expected for a modal view.

An alternate that works is to set 'UIModalPresentationStyle.custom' and then write your own transition. I tried this and wrote a transition that attempts to mimic the default iOS Behaviour Modal Behaviour. Swipe to dismiss works and it feels okay but the tricky thing is implementing the partial swipe logic, where a user may swipe it down 50% and the popover moves down with the users touch but doesn't fully dismiss until the user swipes down further. I couldn't get this working and ended up giving up.

The approach I took in the end was to embrace the new look and access the already present UISheetPresentationController and use detents. The process of implementing it is tricky as I want to retain the same functionality I have now for people using iOS 18 and prior and only implement this new look for iOS 26 and later. I ended up writing a bunch of helper functions similar to the below:

static func preparePopoverForPresentation(vc: UIViewController, customDetents: [CGFloat] = [], mediumDetents: Bool = true, largeDetents: Bool = true) {
    if #available(iOS 26.0, *) {
        if let sheet = vc.sheetPresentationController {
            // Create Detents
            var detents: [UISheetPresentationController.Detent] = []
            for value in customDetents {
                let detentValue = getDetent(basedOn: value)
                detents.append(.custom(resolver: { context in detentValue }))
            }
            if mediumDetents { detents.append(.medium()) }
            if largeDetents { detents.append(.large()) }
            
            // Assign Sheet Values
            sheet.detents = detents
            if detents.count > 1 { sheet.prefersGrabberVisible = true }
            sheet.prefersScrollingExpandsWhenScrolledToEdge = true
        }
    } else {
        // Pre iOS 26 Implementation
        vc.modalPresentationStyle = UIModalPresentationStyle.popover
        vc.modalTransitionStyle = UIModalTransitionStyle.coverVertical
    }
}

All up the work to move my UIKit App to support iOS 26 was around 7-8 Full Days, with a few outstanding issues I'm yet to fully resolve pending future beta builds.

My SwiftUI Apps make the transition a bunch easier but this project is built in UIKit and there is a lot of extra work required for the older UI Frameworks.

It's frustrating to have to spend that long updating things just so my app doesn't look horrible for exisiting users. I'm sure they would have preferred I spent that time building new functionality that is actually useful for them rather than spending 70-80 Hours on what is essentially a compatibility update.

If I could have simply set 'have transparent background' myself I would have easily saved a bunch of time as most of the work was adapting 20+ VCs that used a transparent background with a smaller popover.

Thanks for the suggestions, Bradley. We'll take a look at the UISheetPresentationController approach as a replacement for our current popovers. As you say, it's annoying spending time repairing functionality that has been fine for many years, and suddenly doesn't work anymore. We'd always prefer to be adding new features for our customers. Cheers!

Modal Presentation in UIKit Adds Solid Background in iOS 26
 
 
Q