UIViewController custom transition stuck on iOS13

前端 未结 4 2064
长发绾君心
长发绾君心 2021-02-05 11:42

I\'ve implemented a custom transition between two view controllers in my iOS app and it worked fine with iOS 10, 11, and 12.

Now I want make it ready for iOS 13 using Xc

相关标签:
4条回答
  • 2021-02-05 11:51

    I set up the segue in IB by drag-and-drop from a collection VC to another VC, which is used to display details.

    I have a new discoveries on this problem, To refer to 'toView' and 'fromView', both of the following methods work

    Indirectly way:

    transitionContext.viewController(forKey: .to)?.view
    transitionContext.viewController(forKey: .from)?.view
    

    Directly way:

    transitionContext.view(forKey: .to)
    transitionContext.view(forKey: .from)
    

    But when I switched the segue style to 'Over Full Screen', the directly way return 'nil' for both 'toView' and 'fromView' and only indirectly way work.

    Hope this will be helpful to someone in the future.

    P.S. This is my discovery along my way to solve another problem, which might be helpful, if you also have encounter the problem that 'a working animator' stops working in iOS 13 and above

    0 讨论(0)
  • 2021-02-05 11:54

    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.

    0 讨论(0)
  • 2021-02-05 11:56

    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
    
    0 讨论(0)
  • 2021-02-05 12:01

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

    0 讨论(0)
提交回复
热议问题