2017-07-28 80 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