常用視圖切換方式的比較

在iOS開發(fā)中,比較常用的切換視圖的方式主要有以下幾種:

1.入棧出棧方式 push、pop

使用舉例(ViewController假設(shè)為需要跳轉(zhuǎn)的控制器):

[self.navigationController pushViewController:ViewController animated:YES]; //入棧,跳轉(zhuǎn)到指定控制器視圖
[self.navigationController popViewControllerAnimated:YES]; //彈棧锐峭,返回到前一個(gè)視圖
[self.navigationController popToViewController:ViewController animated:YES]; //彈棧 返回指定控制器所在視圖
[self.navigationController popToRootViewControllerAnimated:YES]; //彈棧 返回根控制器視圖
2.模態(tài) modal

使用舉例(ViewController假設(shè)為需要跳轉(zhuǎn)的控制器):

[self presentViewController:ViewController animated:YES completion:nil]; //跳轉(zhuǎn)到ViewController所在視圖
[self dismissModalViewControllerAnimated:YES]; //退出當(dāng)前視圖
3. 切換window的rootViewController

使用舉例(ViewController假設(shè)為需要跳轉(zhuǎn)的控制器):

UIWindow *window = [UIApplication sharedApplication].keyWindow; //獲得主窗口
window.rootViewController = [[ViewController alloc] init]; //將主窗口的根視圖設(shè)置為當(dāng)前控制器
4. 將另一個(gè)控制器的視圖添加為當(dāng)前控制器視圖的子視圖
[self.view addSubview: ViewController.View]; //實(shí)現(xiàn)復(fù)雜界面的時(shí)候常用

簡要介紹下各種方式的優(yōu)點(diǎn)和不足:

  • push、pop方式
    • 優(yōu)點(diǎn):控制器切換是可逆的,且原始圖不會(huì)銷毀
    • 缺點(diǎn):依賴于UINavigationController盈电,故需要有一個(gè)導(dǎo)航控制器,與某些界面不需要導(dǎo)航控制器有可能會(huì)沖突
      push操作是可逆的杯活,即控制器的切換是可逆的匆帚。
  • modal
    • 優(yōu)點(diǎn):控制器切換是可逆的,且原始圖不會(huì)銷毀
    • 缺點(diǎn):跳轉(zhuǎn)沒有push方式自由旁钧,dismiss方式只能按順序返回吸重,不能跳躍互拾, 從前一個(gè)modal到后一個(gè)時(shí)候,前一個(gè)控制器不會(huì)消失嚎幸,一直在內(nèi)存中

這里說明一下控制器的兩個(gè)可能很多人都沒注意的兩個(gè)只讀屬性:presentedViewController和presentingViewController颜矿,他們分別是被present的控制器和正在presenting的控制器。
這兩個(gè)屬性嫉晶,在有些時(shí)候骑疆,用起來是很方便的。比如說替废,現(xiàn)在有個(gè)C界面箍铭,C界面被顯示出來,可能有兩種情況椎镣,一是modal出來的诈火,另外一種是push出來的,這時(shí)候就可以通過當(dāng)前界面對象的presentingViewController屬性來判斷到底屬于哪種情況衣陶,如果是nil柄瑰,表示是UINavigationController對象push過來的,如果不是則是modal過來的剪况。

  • 切換window的rootViewController
    • 優(yōu)點(diǎn):跳轉(zhuǎn)直接迅速教沾,而且可以銷毀前一個(gè)控制器,因?yàn)閷indow的強(qiáng)引用改為當(dāng)前控制器译断,故前一個(gè)控制器會(huì)消失(ARC環(huán)境)
  • 缺點(diǎn):視圖跳轉(zhuǎn)不可逆
  • 將一個(gè)控制器的視圖添加到當(dāng)前視圖上面
    • 優(yōu)點(diǎn):通過一個(gè)控制器將另一控制器設(shè)置為屬性授翻,自由讀取其他控制器中的視圖從而能夠?qū)崿F(xiàn)復(fù)雜UI界面
  • 缺點(diǎn):復(fù)雜,多數(shù)場合不適用

列表比較如下:

比較項(xiàng)目 push孙咪、pop modal 切換窗口的根控制器 添加子視圖
銷毀源視圖
使用場合 有導(dǎo)航控制器堪唐,需要能夠返回前一個(gè)視圖的情況 沒有導(dǎo)航控制器的跳轉(zhuǎn),能返回前一個(gè)視圖 版本新特性或者不需要保留前一個(gè)控制器的情況 需要實(shí)現(xiàn)復(fù)雜界面的情況
是否有導(dǎo)航控制器

我們這里再說一下針對系統(tǒng)的這兩種視圖切換方式,都有哪些最基本的動(dòng)畫呢?
首先是模態(tài)切換
//常規(guī)模態(tài)切換
push.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentViewController:push animated:YES completion:nil];
/*
     下面是四種具體效果
     UIModalTransitionStyleCoverVertical=0, //默認(rèn)方式翎蹈,豎向上推
     UIModalTransitionStyleFlipHorizontal, //水平反轉(zhuǎn)
     UIModalTransitionStyleCrossDissolve,//隱出隱現(xiàn)
     UIModalTransitionStylePartialCurl,//部分翻頁效果
     */
//當(dāng)你想要使用自定義模態(tài)切換的時(shí)候,這一行代碼是必須的
push.modalPresentationStyle = UIModalPresentationCustom;
當(dāng)使用入棧出棧的方式切換的時(shí)候
PushViewController *push = [[PushViewController alloc]init];
//添加Animation
[self.navigationController.view.layer addAnimation:[self pushAnimation] forKey:nil];
[self.navigationController pushViewController:push animated:YES];

//這里是Animation動(dòng)畫的方法
- (CATransition *)pushAnimation{
    //創(chuàng)建動(dòng)畫
    CATransition* transition = [CATransition animation];
    //設(shè)置持續(xù)時(shí)間
    transition.duration = 0.8;
    //設(shè)置時(shí)間函數(shù)
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
    
    /*私有API
     cube   立方體效果
     pageCurl   向上翻一頁
     pageUnCurl   向下翻一頁
     rippleEffect   水滴波動(dòng)效果
     suckEffect   變成小布?jí)K飛走的感覺
     oglFlip   上下翻轉(zhuǎn)
     cameraIrisHollowClose   相機(jī)鏡頭關(guān)閉效果
     cameraIrisHollowOpen   相機(jī)鏡頭打開效果
     */
    //使用私有API       設(shè)置動(dòng)畫類型
    transition.type = @"cube";
    //或者使用系統(tǒng)共有API
    //transition.type = kCATransitionFade;
    //下面四個(gè)是系統(tǒng)共有的API
    //kCATransitionMoveIn, kCATransitionPush, kCATransitionReveal, kCATransitionFade
    
    //設(shè)置切換方向
    transition.subtype = kCATransitionFromBottom;
    //切換方向有以下四種方式:kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom
    //還可以設(shè)置代理  實(shí)現(xiàn)代理方法來監(jiān)聽動(dòng)畫已經(jīng)開始和已經(jīng)結(jié)束
    transition.delegate = self;
    return transition;
}

還可以用animation轉(zhuǎn)場動(dòng)畫

//方式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) {

    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淮菠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荤堪,更是在濱河造成了極大的恐慌合陵,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澄阳,死亡現(xiàn)場離奇詭異拥知,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碎赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門低剔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事襟齿∫鏊” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵猜欺,是天一觀的道長屋摔。 經(jīng)常有香客問我,道長替梨,這世上最難降的妖魔是什么钓试? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮副瀑,結(jié)果婚禮上弓熏,老公的妹妹穿的比我還像新娘。我一直安慰自己糠睡,他們只是感情好挽鞠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狈孔,像睡著了一般信认。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上均抽,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天嫁赏,我揣著相機(jī)與錄音,去河邊找鬼油挥。 笑死潦蝇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的深寥。 我是一名探鬼主播攘乒,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惋鹅!你這毒婦竟也來了则酝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤闰集,失蹤者是張志新(化名)和其女友劉穎沽讹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體返十,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妥泉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年椭微,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洞坑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝇率,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熬的,我是刑警寧澤往衷,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站咒劲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜布蔗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浪腐。 院中可真熱鬧纵揍,春花似錦、人聲如沸议街。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽特漩。三九已至吧雹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涂身,已是汗流浹背雄卷。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤售,地道東北人龙亲。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像悍抑,于是被迫代替她去往敵國和親鳄炉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容