共通ビュー切り替え方式の比較

5121 ワード

iOSの開発では、一般的なビューの切り替え方法は主に以下のいくつかあります.
1.入桟出桟方式push、pop
例を使用します(ViewControllerはジャンプが必要なコントローラを想定します):
[self.navigationController pushViewController:ViewController animated:YES]; //  ,          
[self.navigationController popViewControllerAnimated:YES]; //  ,        
[self.navigationController popToViewController:ViewController animated:YES]; //              
[self.navigationController popToRootViewControllerAnimated:YES]; //           

2.モダリティmodal
例を使用します(ViewControllerはジャンプが必要なコントローラを想定します):
[self presentViewController:ViewController animated:YES completion:nil]; //   ViewController    
[self dismissModalViewControllerAnimated:YES]; //      

3.WindowsのrootView Controlを切り替える
例を使用します(ViewControllerはジャンプが必要なコントローラを想定します):
UIWindow *window = [UIApplication sharedApplication].keyWindow; //     
window.rootViewController = [[ViewController alloc] init]; //                

4.別のコントローラのビューを現在のコントローラビューのサブビューに追加
[self.view addSubview: ViewController.View]; //           

さまざまな方法の長所と短所を簡単に紹介します.
  • push、pop方式
  • の利点:コントローラ切替は可逆的であり、元の図は
  • を破棄しない.
  • の欠点:UINAvigationControllerに依存するため、ナビゲーションコントローラが必要であり、一部のインタフェースでナビゲーションコントローラを必要としない場合、push操作が可逆的である可能性があり、すなわちコントローラの切り替えが可逆的である.

  • modal
  • の利点:コントローラ切替は可逆的であり、元の図は
  • を破棄しない.
  • 欠点:ジャンプはpush方式の自由がなく、dismiss方式は順番に戻るしかなく、ジャンプできず、前のmodalから後の1つの時まで、前のコントローラは消えず、メモリの中で
  • ずっと

    ここでは、presentedViewControlとpresentingViewControlの2つの読み取り専用プロパティに注意していない人が多いかもしれません.それぞれpresentのコントローラとpresenting中のコントローラです.この2つの属性は、時々、使いやすいです.例えば、現在Cインタフェースがあり、Cインタフェースが表示されている場合、modalが出てきた場合と、pushが出てきた場合の2つのケースがあるかもしれません.この場合、現在のインタフェースオブジェクトのpresentingViewController属性によって、どの状況に属しているのかを判断することができます.nilであれば、UInavigationControllerオブジェクトpushが来ていることを示します.そうでなければmodalが来たのです.
  • windowのrootView Controlを切り替えます
  • の利点:ジャンプが直接迅速で、前のコントローラを破棄することができます.windowの強い参照を現在のコントローラに変更するため、前のコントローラは消えます(ARC環境)
  • .
  • 欠点:ビュージャンプ不可逆
  • 現在のビューにコントローラのビューを追加
  • の利点:1つのコントローラが別のコントローラを属性に設定ことで、他のコントローラのビューを自由に読み取ることができ、複雑なUIインタフェース
  • を実現することができる.
  • 欠点:複雑で、多くの場合
  • は適用されません.
    リストの比較は次のとおりです.
    プロジェクトの比較
    push、pop
    modal
    ウィンドウのルートコントローラを切り替え
    サブビューの追加
    ソースビューの破棄
    いいえ
    いいえ
    はい
    いいえ
    使用する場合
    ナビゲーションコントローラがあり、前のビューに戻る必要がある場合
    ナビゲーションコントローラのジャンプがなく、前のビューに戻ることができます
    バージョンの新しいプロパティまたは前のコントローラを保持する必要がない場合
    複雑なインタフェースが必要な場合
    ナビゲーションコントローラがあるかどうか
    はい
    いいえ
    いいえ
    いいえ
    ここでは、システムに対するこの2つのビューの切り替え方法についてお話ししますが、最も基本的なアニメーションは何ですか?
    まずモード切り替え
    //      
    push.modalTransitionStyle = UIModalTransitionStylePartialCurl;
    [self presentViewController:push animated:YES completion:nil];
    /*
                  
         UIModalTransitionStyleCoverVertical=0, //    ,    
         UIModalTransitionStyleFlipHorizontal, //    
         UIModalTransitionStyleCrossDissolve,//    
         UIModalTransitionStylePartialCurl,//      
         */
    
    //                ,         
    push.modalPresentationStyle = UIModalPresentationCustom;
    

    スタックアウト方式で切り替える場合
    PushViewController *push = [[PushViewController alloc]init];
    //  Animation
    [self.navigationController.view.layer addAnimation:[self pushAnimation] forKey:nil];
    [self.navigationController pushViewController:push animated:YES];
    
    //   Animation     
    - (CATransition *)pushAnimation{
        //    
        CATransition* transition = [CATransition animation];
        //      
        transition.duration = 0.8;
        //      
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
        
        /*  API
         cube        
         pageCurl        
         pageUnCurl        
         rippleEffect         
         suckEffect             
         oglFlip       
         cameraIrisHollowClose           
         cameraIrisHollowOpen           
         */
        //    API             
        transition.type = @"cube";
        //        API
        //transition.type = kCATransitionFade;
        //          API
        //kCATransitionMoveIn, kCATransitionPush, kCATransitionReveal, kCATransitionFade
        
        //      
        transition.subtype = kCATransitionFromBottom;
        //           :kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
        //                             
        transition.delegate = self;
        return transition;
    }
    

    アニメイトで動画を転載することもできます
    //  1
    [UIView transitionWithView:[UIApplication sharedApplication].keyWindow duration:0.5f options:UIViewAnimationOptionTransitionFlipFromBottom animations:^{
    
            BOOL oldState = [UIView areAnimationsEnabled];
            [UIView setAnimationsEnabled:NO];
            [UIApplication sharedApplication].keyWindow.rootViewController = [[ChatViewController alloc]init];
            [UIView setAnimationsEnabled:oldState];
    
        } completion:^(BOOL finished) {
    
        }];
        
        
    //  2
        [UIView transitionFromView:self.view toView:chatVC.view duration:1 options:UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL finished) {
    
        }];