Search code examples
c#iosxamarinmvvmmvvmcross

MvvmCross - How to Add Custom Modal Transition


I am working on a project using MvvmCross and Xamarin. I am trying to add a custom transition when presenting and dismissing my modal view. Currently I am presenting it this way:

[MvxModalPresentation(WrapInNavigationController = true, ModalPresentationStyle = UIModalPresentationStyle.Custom)]
public partial class MyView : MvxViewController
{

and dismissing it this way:

NavigationController.DismissModalViewController(true);

So I have my animation ready, but I am assuming that I need to set the transition delegate to the one I've created. How do I do this?

I am fairly new to MvvmCross, so any tips and tricks are very much appreciated. Thanks!


Solution

  • I Am not sure, what you actually want to achieve here.

    If you are looking for syntax help. This should be something like this.

    this.NavigationController.TransitioningDelegate = new MyOwnDelegate();
    
    
      internal class MyOwnDelegate : IUIViewControllerTransitioningDelegate
        {
            public IntPtr Handle => throw new NotImplementedException();
    
            public void Dispose()
            {
                //throw new NotImplementedException();
            }
        }
    

    But normally people use, this one. I am also giving some syntax if that helps

    this.NavigationController.Delegate = new NavigationControllerDelegate();
    
    
    
     public class NavigationControllerDelegate : UINavigationControllerDelegate
    {
        public NavigationControllerDelegate(IntPtr handle) : base(handle)
        {
        }
        public NavigationControllerDelegate()
        {
        }
        public override IUIViewControllerAnimatedTransitioning GetAnimationControllerForOperation(UINavigationController navigationController, UINavigationControllerOperation operation, UIViewController fromViewController, UIViewController toViewController)
        {
            var fromVcConformA = fromViewController as ICustomTransition;
            var fromVCConFromB = fromViewController as IWaterFallViewControllerProtocol;
            var fromVCCConformc = fromViewController as IHorizontalPageViewControllerProtocol;
    
            var toVcConformA = toViewController as ICustomTransition;
            var toVCConfromB = toViewController as IWaterFallViewControllerProtocol;
            var toVCCConformc = toViewController as IHorizontalPageViewControllerProtocol;
    
            if ((fromVcConformA != null) && (toVcConformA != null) && ((fromVCConFromB != null && toVCCConformc != null) || (fromVCCConformc != null && toVCConfromB != null)))
            {
                var transition = new CustomTransition();
                transition.presenting = operation == UINavigationControllerOperation.Pop;
                return transition;
            }
            else
            {
                return null;
            }
        }
    
    }