共通ビュー切り替え方式の比較
5121 ワード
iOSの開発では、一般的なビューの切り替え方法は主に以下のいくつかあります.
1.入桟出桟方式push、pop
例を使用します(ViewControllerはジャンプが必要なコントローラを想定します):
2.モダリティmodal
例を使用します(ViewControllerはジャンプが必要なコントローラを想定します):
3.WindowsのrootView Controlを切り替える
例を使用します(ViewControllerはジャンプが必要なコントローラを想定します):
4.別のコントローラのビューを現在のコントローラビューのサブビューに追加
さまざまな方法の長所と短所を簡単に紹介します. 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つのビューの切り替え方法についてお話ししますが、最も基本的なアニメーションは何ですか?
まずモード切り替え
スタックアウト方式で切り替える場合
アニメイトで動画を転載することもできます
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]; //
さまざまな方法の長所と短所を簡単に紹介します.
ここでは、presentedViewControlとpresentingViewControlの2つの読み取り専用プロパティに注意していない人が多いかもしれません.それぞれpresentのコントローラとpresenting中のコントローラです.この2つの属性は、時々、使いやすいです.例えば、現在Cインタフェースがあり、Cインタフェースが表示されている場合、modalが出てきた場合と、pushが出てきた場合の2つのケースがあるかもしれません.この場合、現在のインタフェースオブジェクトのpresentingViewController属性によって、どの状況に属しているのかを判断することができます.nilであれば、UInavigationControllerオブジェクトpushが来ていることを示します.そうでなければmodalが来たのです.
リストの比較は次のとおりです.
プロジェクトの比較
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) {
}];