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ù)制代碼

知識點1:

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

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

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

d: 需要注意的是,默認他的實現(xiàn)過程是移除跳轉(zhuǎn)之前的控制器的view,并將新的控制器的view展示,但跳轉(zhuǎn)之前的控制器并沒有被釋放,而是被強引用這的。區(qū)別于導(dǎo)航控制器的push。

e: 通過 dismissViewControllerAnimated 來返回前一個界面的

知識點2:例如在當(dāng)前A控制器利用模態(tài)跳轉(zhuǎn)到另一個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ù)制代碼

知識點3:兩個重要的枚舉對象

復(fù)制代碼

//彈出時的動畫風(fēng)格

typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {

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

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

UIModalTransitionStyleCrossDissolve,? //交叉溶解

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

};

//彈出風(fēng)格

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {

UIModalPresentationFullScreen = 0,? //代表彈出VC時,VC充滿全屏

UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2),? //VC的高度和當(dāng)前屏幕高度相同,寬度和豎屏模式下屏幕寬度相同,剩余未覆蓋區(qū)域?qū)儼挡⒆柚褂脩酎c擊.這種彈出模式下,豎屏?xí)r跟UIModalPresentationFullScreen的效果一樣,橫屏?xí)r候兩邊則會留下變暗的區(qū)域;

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

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

//自定義轉(zhuǎn)場 模態(tài)轉(zhuǎn)場 需要代理實現(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;

//指定返回跳到詳細的哪一個上 回到指定的子控制器

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

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

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

復(fù)制代碼

知識點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ù)制代碼

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

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

例如:

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

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

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

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

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

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

[self dismissViewControllerAnimated:YES completion:nil];

知識點3:解決使用[self.navigationController pushViewController:VC animated:YES]; push卡頓

復(fù)制代碼

UIViewController *vc = [UIViewController new];

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

上述代碼推出界面會卡頓

解決辦法:

UIViewController *vc = [UIViewController new];

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容