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."