0

新しいIOS 5 Container viewControllerが正しく動作するようにしようとしていますが、問題が発生しています。IOS同じ画面上の子viewController間の移行

私は "rootViewController"を持っています。このコントローラでは、2つの子ビューコントローラを追加しました。これはsplitViewControllerとほとんど同じです。左側にはナビゲーションを処理するVCがあり、右側には特定のコンテンツを表示するVCがあります。

私は右のVCとそれを置き換える新しいVCの間でアニメートしようとしています。

これは、アニメーションのために私のコードです:ほぼすべての作品

public void Animate(UIViewController toController) { 
    AddChildViewController(toController); 
    activeRightController.WillMoveToParentViewController(null); 
    toController.View.Frame = activeRightController.View.Frame; 
    Transition(activeRightController, toController, 1.0, UIViewAnimationOptions.TransitionCurlUp,() => {}, 
     (finished) => { 
     activeRightController.RemoveFromParentViewController(); 
     toController.DidMoveToParentViewController(this); 
     activeRightController = toController; 
    }); 
    activeRightController = toController; 
} 

、それはCurlUp遷移を使用して私の新しいビューに遷移し、しかし、移行自体だけではなく、単一の...画面全体を横切ります私は移行したいと思う。その "curling Up"は親ビューであり、子ではありません。しかし、それはその下の子ビューだけを置き換えます。私はこれが理にかなってほしい。

答えて

6

右側のコントローラのシンコンテナであり、スワップアニメーションを処理する新しいUIViewControllerクラスを作成しました。以下のサンプルを参照してください。

using System; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 
using System.Drawing; 

namespace delete20120425 
{ 
    [Register ("AppDelegate")] 
    public partial class AppDelegate : UIApplicationDelegate 
    { 
     UIWindow window; 
     MainViewController mvc; 

     public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
     { 
      window = new UIWindow (UIScreen.MainScreen.Bounds); 

      mvc = new MainViewController(); 

      window.RootViewController = mvc; 
      window.MakeKeyAndVisible(); 

      return true; 
     } 
    } 

    public class MainViewController : UIViewController 
    { 
     SubViewController vc1; 
     ContainerViewController vc2; 

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

      vc1 = new SubViewController (UIColor.Blue); 
      this.AddChildViewController (vc1); 
      this.View.AddSubview (vc1.View); 

      UIButton btn = UIButton.FromType (UIButtonType.RoundedRect); 
      btn.Frame = new RectangleF (20, 20, 80, 25); 
      btn.SetTitle ("Click", UIControlState.Normal); 
      vc1.View.AddSubview (btn); 

      SubViewController tmpvc = new SubViewController (UIColor.Yellow); 
      vc2 = new ContainerViewController (tmpvc); 

      this.AddChildViewController (vc2); 
      this.View.AddSubview (vc2.View); 

      btn.TouchUpInside += HandleBtnTouchUpInside; 
     } 

     void HandleBtnTouchUpInside (object sender, EventArgs e) 
     { 
      SubViewController toController = new SubViewController (UIColor.Green); 
      vc2.SwapViewController (toController); 
     } 

     public override void ViewWillLayoutSubviews() 
     { 
      base.ViewDidLayoutSubviews(); 

      RectangleF lRect = this.View.Bounds; 
      RectangleF rRect = lRect; 

      lRect.X = lRect.Y = lRect.Y = 0; 

      lRect.Width = .3f * lRect.Width; 
      rRect.X = lRect.Width + 1; 
      rRect.Width = (.7f * rRect.Width)-1; 

      this.View.Subviews[0].Frame = lRect; 
      this.View.Subviews[1].Frame = rRect; 
     } 

     public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) 
     { 
      return true; 
     } 
    } 

    public class ContainerViewController : UIViewController 
    { 
     UIViewController _ctrl; 
     public ContainerViewController (UIViewController ctrl) 
     { 
      _ctrl = ctrl; 
     } 

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

      AddChildViewController (_ctrl); 
      View.AddSubview (_ctrl.View); 
     } 

     public void SwapViewController (UIViewController toController) 
     { 
      UIViewController activeRightController = _ctrl; 

      AddChildViewController(toController); 
      activeRightController.WillMoveToParentViewController(null); 
      toController.View.Frame = activeRightController.View.Frame; 
      Transition(activeRightController, toController, 1.0, UIViewAnimationOptions.TransitionCurlUp,() => {}, 
       (finished) => { 
       activeRightController.RemoveFromParentViewController(); 
       toController.DidMoveToParentViewController(this); 
       activeRightController = toController; 
      }); 
      activeRightController = toController; 
     } 

     public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) 
     { 
      return true; 
     } 

     public override void ViewWillLayoutSubviews() 
     { 
      base.ViewWillLayoutSubviews(); 
      RectangleF tmp = this.View.Frame; 
      tmp.X = tmp.Y = 0; 
      _ctrl.View.Frame = tmp; 
     } 
    } 

    public class SubViewController : UIViewController 
    { 
     UIColor _back; 
     public SubViewController (UIColor back) 
     { 
      _back = back; 
     } 

     public override void ViewDidLoad() 
     { 
      base.ViewDidLoad(); 
      this.View.BackgroundColor = _back; 
     } 

     public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) 
     { 
      return true; 
     } 
    } 
} 
+0

私はかなりこの例まで、コンテナVEWコントローラを理解していませんでした。どうもありがとう。これは完全に機能しました。 –

+0

可能であれば、私は2度投票します – Omtara

+0

元のビューに戻ってどうですか? – PLOW

関連する問題