UIViewController跳轉(zhuǎn)

一:UIViewController模態(tài)跳轉(zhuǎn)

復(fù)制代碼

//展示模態(tài)視圖

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);

//關(guān)閉模態(tài)視圖

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);

//只到IOS6

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

//只到IOS6

- (void)dismissModalViewControllerAnimated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

復(fù)制代碼

知識(shí)點(diǎn)1:

a: 在官方文檔中解阅,建議這兩者之間通過delegate實(shí)現(xiàn)交互界赔。例如使用UIImagePickerController從系統(tǒng)相冊(cè)選取照片或者拍照蒜撮,imagePickerController和彈出它的VC之間就通過UIImagePickerControllerDelegate實(shí)現(xiàn)交互的。

b: 控制器的中的只讀屬性:presentedViewController和presentingViewController演怎,他們分別就是被present的控制器和正在presenting的控制器。

c: Modal的效果:默認(rèn)是新控制器從屏幕的最底部往上鉆健民,直到蓋住之前的控制器為止憾朴。但可以通過自定義轉(zhuǎn)場(chǎng)來改變展現(xiàn)view的動(dòng)畫,大小热幔,位置乐设,是否移除跳轉(zhuǎn)之前的view.這個(gè)效果可以用來模擬ipad特有的Popover彈出框。

d: 需要注意的是绎巨,默認(rèn)他的實(shí)現(xiàn)過程是移除跳轉(zhuǎn)之前的控制器的view近尚,并將新的控制器的view展示,但跳轉(zhuǎn)之前的控制器并沒有被釋放场勤,而是被強(qiáng)引用這的戈锻。區(qū)別于導(dǎo)航控制器的push。

e: 通過 dismissViewControllerAnimated 來返回前一個(gè)界面的

知識(shí)點(diǎn)2:例如在當(dāng)前A控制器利用模態(tài)跳轉(zhuǎn)到另一個(gè)B控制器

復(fù)制代碼

1.當(dāng)前A控制器和媳,跳轉(zhuǎn)代碼

RecipeAddViewController *addController = [[RecipeAddViewController alloc] init];

addController.modalPresentationStyle = UIModalPresentationFullScreen;

addController.transitionStyle = UIModalTransitionStyleCoverVertical;

[self presentViewController:addController animated:YES completion: nil];

2.返回當(dāng)前A控制器格遭,在剛才跳到的B控制器中,加上返回代碼

[self dismissViewControllerAnimated:YES completion:NULL];

復(fù)制代碼

知識(shí)點(diǎn)3:兩個(gè)重要的枚舉對(duì)象

復(fù)制代碼

//彈出時(shí)的動(dòng)畫風(fēng)格

typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {

UIModalTransitionStyleCoverVertical = 0,? //從底部滑入

UIModalTransitionStyleFlipHorizontal,? //水平翻轉(zhuǎn)進(jìn)入

UIModalTransitionStyleCrossDissolve,? //交叉溶解

UIModalTransitionStylePartialCurl NS_ENUM_AVAILABLE_IOS(3_2),? //翻頁

};

//彈出風(fēng)格

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {

UIModalPresentationFullScreen = 0,? //代表彈出VC時(shí)窗价,VC充滿全屏

UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2),? //VC的高度和當(dāng)前屏幕高度相同如庭,寬度和豎屏模式下屏幕寬度相同叹卷,剩余未覆蓋區(qū)域?qū)?huì)變暗并阻止用戶點(diǎn)擊.這種彈出模式下撼港,豎屏?xí)r跟UIModalPresentationFullScreen的效果一樣坪它,橫屏?xí)r候兩邊則會(huì)留下變暗的區(qū)域;

UIModalPresentationFormSheet NS_ENUM_AVAILABLE_IOS(3_2),? //VC的高度和寬度均會(huì)小于屏幕尺寸帝牡,VC居中顯示往毡,四周留下變暗區(qū)域;

UIModalPresentationCurrentContext NS_ENUM_AVAILABLE_IOS(3_2),? //VC的彈出方式和彈出VC的VC的父VC的方式相同

//自定義轉(zhuǎn)場(chǎng) 模態(tài)轉(zhuǎn)場(chǎng) 需要代理實(shí)現(xiàn)

UIModalPresentationCustom NS_ENUM_AVAILABLE_IOS(7_0),

UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),

UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0),

UIModalPresentationPopover NS_ENUM_AVAILABLE_IOS(8_0),

//告訴Presentation控制器忽視緊湊環(huán)境并繼續(xù)使用前面的Presentation風(fēng)格

UIModalPresentationNone NS_ENUM_AVAILABLE_IOS(7_0) = -1,

};

復(fù)制代碼

二:導(dǎo)航控制器UINavigationController跳轉(zhuǎn)

復(fù)制代碼

//推出界面

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

//返回 將棧頂?shù)目刂破饕瞥?/p>

- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated;

//指定返回跳到詳細(xì)的哪一個(gè)上 回到指定的子控制器

- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;

//返回到最頂級(jí) 回到根控制器(棧底控制器)

- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

復(fù)制代碼

知識(shí)點(diǎn)1:popToViewController用法

復(fù)制代碼

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2]

animated:YES];

UIViewController *popCtl;

for (UIViewController *ctl in self.navigationController.viewControllers) {

if ([ctl isKindOfClass:[MyViewController class]]) {

popCtl = ctl;

break;

}

}

if (popCtl) {

[self.navigationController popToViewController:popCtl animated:YES];

}

復(fù)制代碼

知識(shí)點(diǎn)2:iOS解決使用模態(tài)視圖 導(dǎo)致無法pushViewController

模態(tài)視圖默認(rèn)從界面底部滑出并占據(jù)整個(gè)界面靶溜,并短暫地顯示與之前不同的界面开瞭,直到用戶完成某項(xiàng)操作。模態(tài)視圖完成和程序主功能有關(guān)系的獨(dú)立任務(wù)罩息,尤其適合于主功能界面中欠缺的多級(jí)子任務(wù)嗤详。例如撰寫新郵件時(shí)的模態(tài)視圖.

例如:

當(dāng)?shù)卿浗缑娴淖鳛槟B(tài)視圖的話. 當(dāng)我們離開當(dāng)前界用presentViewController彈出登錄界面的話..就會(huì)導(dǎo)致在登錄界面這個(gè)模態(tài)視圖中視圖間的跳轉(zhuǎn)會(huì)失效. 這是由于模態(tài)視圖其實(shí)是不同于導(dǎo)航控制器的新的視圖, 并且只有將這個(gè)視圖處理完成后才能回到原來的視圖. 模態(tài)視圖就相當(dāng)于死胡同 進(jìn)入就必須原路返回, 也就是不可以在模態(tài)視圖中執(zhí)行頁面跳轉(zhuǎn).

也就是模態(tài)中無法獲取導(dǎo)航控制器 表現(xiàn)在代碼里則:self.navigationController是空的,哪如何讓模態(tài)中的self.navigationController不空呢, 也就很簡(jiǎn)單了, 只需要將登錄這個(gè)視圖控制器封裝成navigationController 彈出來, 而這個(gè)模態(tài)只作為這個(gè)navigationController的rootViewController即可

UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:loginVC];

[self.navigationController presentViewController:navi animated:YES completion:nil];

然后, 在這個(gè)模態(tài)中視圖的跳轉(zhuǎn)就可以有我們傳過來的這個(gè)導(dǎo)航控制器完成了,表現(xiàn)在代碼;則:self.navigationController是存在的. 如果再想跳轉(zhuǎn)就可以用pushViewController了瓷炮;因?yàn)榘b了一層navigationController這個(gè)'模態(tài)'會(huì)有導(dǎo)航欄 自行隱藏即可

退出模態(tài)視圖:

[self dismissViewControllerAnimated:YES completion:nil];

知識(shí)點(diǎn)3:解決使用[self.navigationController pushViewController:VC animated:YES]; push卡頓

復(fù)制代碼

UIViewController *vc = [UIViewController new];

[self.navigationController pushViewController:vc animated:YES];

上述代碼推出界面會(huì)卡頓

解決辦法:

UIViewController *vc = [UIViewController new];

vc.view.backgroundColor = [UIColor 推出時(shí)你想要的控制器View的顏色]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葱色,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子娘香,更是在濱河造成了極大的恐慌苍狰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烘绽,死亡現(xiàn)場(chǎng)離奇詭異淋昭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)安接,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門翔忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赫段,你說我怎么就攤上這事呀打。” “怎么了糯笙?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贬丛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我给涕,道長(zhǎng)豺憔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任够庙,我火速辦了婚禮恭应,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耘眨。我一直安慰自己昼榛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布剔难。 她就那樣靜靜地躺著胆屿,像睡著了一般奥喻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上非迹,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天环鲤,我揣著相機(jī)與錄音,去河邊找鬼憎兽。 笑死冷离,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纯命。 我是一名探鬼主播西剥,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亿汞!你這毒婦竟也來了蔫耽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤留夜,失蹤者是張志新(化名)和其女友劉穎匙铡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍粥,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳖眼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚼摩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦讳。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枕面,靈堂內(nèi)的尸體忽然破棺而出愿卒,到底是詐尸還是另有隱情,我是刑警寧澤潮秘,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布琼开,位于F島的核電站,受9級(jí)特大地震影響枕荞,放射性物質(zhì)發(fā)生泄漏柜候。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一躏精、第九天 我趴在偏房一處隱蔽的房頂上張望渣刷。 院中可真熱鬧,春花似錦矗烛、人聲如沸辅柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌嘀。三九已至碾篡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筏餐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工牡拇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魁瞪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓惠呼,卻偏偏與公主長(zhǎng)得像导俘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剔蹋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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