UIViewController custom transition stuck on iOS13

Ok, it was easy, even though, it's a breaking API change of Apple.

viewController.modalPresentationStyle = .fullScreen

Now I have to go through my whole project and check all modal presentations if they still look as I need them to.


The answer above is correct to set modalPresentationStyle to .fullScreen, however it is also worth to mention that if your view controller is embedded in a UINavigationController, you need to set it on the navigation controller:

navigationController.modalPresentationStyle = .fullScreen

TL;DR

This is a bug in iOS, but you can use context.viewController(forKey:.from).view as a workaround.

Full Details

This appears to be a bug in iOS 13.0. As of iOS 13.1 beta 3, it's still there as well. http://www.openradar.me/radar?id=4999313432248320

The transition context's view(forKey:) method is incorrectly returning nil under certain circumstances. It appears this is happening for view(forKey: .from) when the presenting view controller is being presented non-modally. When dismissing a view controller that was originally presented from a non-modal view controller, the result of view(forKey: .to) is also nil.

I've observed this not only on the new sheet-style presentation on iPhone, but also in normal form sheets and popovers on iPad.

Another manifestation of this issue seems to be that the finalFrame(for:) method returns an incorrect CGRect when asked what the final frame for this view controller should be. In my testing, it is returning a full-screen rect, even though the correct view is smaller.

A workaround is to use the root view controller of view controller returned by viewController(forKey:) method, although the documentation explicitly discourages that: "The view returned by this method may or may not be the root view of the corresponding view controller."