2017-07-28 82 views
0

我想实现像所有大名字一样滑入我的Xamarin iOS应用程序。我发现在Swift中编写了一个simple example,但我陷入了第二个代码区域。Xamarin iOS - 互动滑动

class MyViewController: UIViewController, UINavigationControllerDelegate { 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.navigationController?.delegate = self 
    } 

    func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return SimpleAnimationController() 
    } 
} 

问题是,在C#中一个类只能从一个类或多个接口继承。另外我也不清楚功能func navigationController在做什么。

那么如何翻译代码片段?

感谢您的帮助!

[编辑1]

所以我现在实现的类是这样的:

public class MyFadeTransition : UIPercentDrivenInteractiveTransition, IUIViewControllerAnimatedTransitioning 
{ 
    private UIViewController TransitioningController; 

    public MyFadeTransition(UIViewController transitioningController) 
    { 
     TransitioningController = transitioningController; 
     TransitioningController.View.AddGestureRecognizer(new UIPanGestureRecognizer(DidPan)); 
    } 

    void IUIViewControllerAnimatedTransitioning.AnimateTransition(IUIViewControllerContextTransitioning transitionContext) 
    { 
     var fromViewController = transitionContext.GetViewControllerForKey(UITransitionContext.FromViewControllerKey); 

     var toViewController = transitionContext.GetViewControllerForKey(UITransitionContext.ToViewControllerKey); 
     transitionContext.ContainerView.AddSubview(toViewController.View); 

     toViewController.View.Alpha = 0.0f; 

     UIView.Animate(0.35,() => 
     { 
      toViewController.View.Alpha = 1.0f; 
      Debug.WriteLine("Custom Transitioning"); 

     },() => 
     { 
      transitionContext.CompleteTransition(!transitionContext.TransitionWasCancelled); 
      Debug.WriteLine("Custom Transitioning Done"); 

     }); 
    } 

    double IUIViewControllerAnimatedTransitioning.TransitionDuration(IUIViewControllerContextTransitioning transitionContext) 
    { 
     return 0.35; 
    } 

    public void DidPan(UIPanGestureRecognizer gesture) 
    { 
     var point = gesture.LocationInView(TransitioningController.View); 
     double percent = Math.Max(Math.Min((point.X/300), 0.99), 0.0f); 

     Debug.WriteLine(string.Format("Point: {0} | Percent: {1}", point, percent)); 

     switch (gesture.State) 
     { 
      case UIGestureRecognizerState.Began: 
       // this.UsingGesture = true 
       this.TransitioningController.NavigationController?.PopViewController(true); 
       break; 
      case UIGestureRecognizerState.Changed: 
       UpdateInteractiveTransition((System.nfloat)percent); 
       break; 
      case UIGestureRecognizerState.Ended: 
      case UIGestureRecognizerState.Cancelled: 
       if (percent > 0.5) 
       { 
        Debug.WriteLine("Finishing Transition"); 
        this.FinishInteractiveTransition(); 
       } 
       else 
       { 
        Debug.WriteLine("Cancelling Transition"); 
        this.CancelInteractiveTransition(); 
       } 
       break; 
      default: 
       Debug.WriteLine("Unhandled Transition state"); 
       break; 
     } 
    } 
} 

现在ViewControllers正在转换,但他们也如果用户只刷卡一些像素。有什么想法发生在这里?

回答

0

在Xamarin.iOS你有一个接口相当于:

IUINavigationControllerDelegate 

,只要你想,可以实现任意多的接口。

你可以找到它正确的here

的Xamarin的翻译是

public class MyViewController : UIViewController, IUINavigationControllerDelegate 
{ 

    public override void AwakeFromNib() 
    { 
     base.AwakeFromNib(); 
     NavigationController.Delegate = this; 
    } 

    [Export("navigationController:animationControllerForOperation:fromViewController:toViewController:")] 
    public IUIViewControllerAnimatedTransitioning GetAnimationControllerForOperation(UINavigationController navigationController, UINavigationControllerOperation operation, UIViewController fromViewController, UIViewController toViewController) 
    { 
     return new SimpleAnimationController(); 
    } 
} 
+0

我明白了,但行** NavigationController.Delegate =这一点; **抛出一个异常,是否叫AwakeFromNib或viewDidLoad中。 ** System.Reflection.TargetInvocationException:调用的目标引发了异常。 ---> System.NullReferenceException:对象不设置为一个对象** **编辑的一个实例:**有趣的事情:**如果(!this.NavigationController = NULL){ \t \t \t \t NavigationController。代表=这个; \t \t \t} **似乎做的工作 –

+0

这是因为你的ViewController没有NavigationController。 你如何启动MyViewController?你使用PushViewController方法吗?它必须位于NavigationController的导航堆栈中,仅当您在显示ViewController时使用PushViewController或者使用新的ViewController作为根ViewController创建新的NavigationController时才会发生此情况。 – stonecompass

+0

看到https://stackoverflow.com/a/7767160/2710750 – stonecompass