C# 如何将UIViewControllerTransitioningDelegate与MvxIosViewPresenter一起使用?
我有一个视图控制器C# 如何将UIViewControllerTransitioningDelegate与MvxIosViewPresenter一起使用?,c#,xamarin,xamarin.ios,mvvmcross,C#,Xamarin,Xamarin.ios,Mvvmcross,我有一个视图控制器a和一个视图控制器B,我想通过自定义转换(UIViewControllerTransitioningDelegate)从a导航到B(以模式显示),如何使用MvxIosViewPresenter 我需要自己编写一个完全定制的演示者吗?还是有一种方法可以优雅地编写呢?完全可以在MvxIosViewPresenter中使用自定义转换。您只需创建一个自定义的UIViewControllerTransitioningDelegate并将其分配给您的ViewController(ViewD
a
和一个视图控制器B
,我想通过自定义转换(UIViewControllerTransitioningDelegate
)从a
导航到B
(以模式显示),如何使用MvxIosViewPresenter
我需要自己编写一个完全定制的演示者吗?还是有一种方法可以优雅地编写呢?完全可以在
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);
});
}
[MvxModalPresentation(ModalPresentationStyle=UIModalPresentationStyle.OverFullScreen,ModalTransitionStyle=UIModalTransitionStyle.CrossResolve)]
公共部分类ModalView:MvxViewController
{
公共ModalView(IntPtr手柄):基座(手柄)
{
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
TransitioningDelegate=新的TransitioningDelegate();
}
}
公共类转换委托:UIViewControllerTransitioningDelegate
{
public override IUIViewcontrolleranimated转换GetAnimationControllerForPresentedController(显示UIViewController、显示UIViewController、显示UIViewController源)
{
返回新的CustomTransitionAnimator();
}
}
公共类CustomTransitionAnimator:UIViewControllerAnimatedTransitioning
{
公共覆盖双重转换持续时间(IUIViewController上下文转换转换转换上下文)
{
返回1.0f;
}
公共覆盖无效动画转换(IUIViewController上下文转换转换转换上下文)
{
var inView=transitionContext.ContainerView;
var toVC=transitionContext.getViewControllerWorkey(UITransitionContext.ToViewControllerKey);
var toView=toVC.View;
inView.AddSubview(toView);
var frame=toView.frame;
toView.Frame=CGRect.Empty;
UIView.Animate(TransitionDuration(transitionContext))=>
{
toView.Frame=新的CGRect(10,10,Frame.Width-20,Frame.Height-20);
}, () =>
{
transitionContext.CompleteTransition(真);
});
}
}啊,我想通过演示者来控制它,但我想这也行得通。:-)