如何在MvxIosViewPresenter中使用UIViewControllerTransitioningDelegate?

时间:2017-07-25 17:44:01

标签: c# xamarin xamarin.ios mvvmcross

我有一个视图控制器A和一个视图控制器B,我希望从A导航到B(以模态方式呈现)并使用自定义转换({{ 1}}),我如何使用UIViewControllerTransitioningDelegate

我是否需要自己编写一个完全自定义的演示者,或者是否有办法以优雅的方式进行操作?

1 个答案:

答案 0 :(得分:1)

完全可以使用MvxIosViewPresenter的自定义转换。您所要做的就是创建一个自定义UIViewControllerTransitioningDelegate并将其分配给您的ViewController(ViewDidLoad是一个很好的地方)。

这样的事情应该做的工作:

[MvxModalPresentation(ModalPresentationStyle = UIModalPresentationStyle.OverFullScreen, ModalTransitionStyle = UIModalTransitionStyle.CrossDissolve)]
public partial class ModalView : MvxViewController<ModalViewModel>
{
    public ModalView(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        TransitioningDelegate = new TransitioningDelegate();
    }
}

public class TransitioningDelegate : UIViewControllerTransitioningDelegate
{
    public override IUIViewControllerAnimatedTransitioning GetAnimationControllerForPresentedController(UIViewController presented, UIViewController presenting, UIViewController source)
    {
        return new CustomTransitionAnimator();
    }
}

public class CustomTransitionAnimator : UIViewControllerAnimatedTransitioning
{
    public override double TransitionDuration(IUIViewControllerContextTransitioning transitionContext)
    {
        return 1.0f;
    }

    public override void AnimateTransition(IUIViewControllerContextTransitioning transitionContext)
    {
        var inView = transitionContext.ContainerView;
        var toVC = transitionContext.GetViewControllerForKey(UITransitionContext.ToViewControllerKey);
        var toView = toVC.View;

        inView.AddSubview(toView);

        var frame = toView.Frame;
        toView.Frame = CGRect.Empty;

        UIView.Animate(TransitionDuration(transitionContext), () =>
        {
            toView.Frame = new CGRect(10, 10, frame.Width - 20, frame.Height - 20);
        }, () =>
        {
            transitionContext.CompleteTransition(true);
        });
    }

}