国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

自定義視圖控制器切換(iOS)

2019-11-14 20:30:01
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在iOS開(kāi)發(fā)過(guò)程中,通常我們會(huì)使用UINavigationController,UITabbarController等蘋(píng)果提供的視圖控制器來(lái)切換我們的視圖。在iOS5之前,如果要自定義容器視圖控制器很麻煩,比如你要考慮到子視圖的生命周期,當(dāng)設(shè)備旋轉(zhuǎn)時(shí)的情況等,好在iOS5中蘋(píng)果提供了添加視圖控制器(addChildViewController)等管理視圖控制器的API,這樣我們就能使用此API來(lái)自定義自己的視圖控制器了,這篇文章只要介紹如何使用此API實(shí)現(xiàn)UITabbarController的基本功能。

開(kāi)始

使用過(guò)UITabbarController的都知道,UITabbarController可以在多個(gè)UIViewController中切換,來(lái)顯示多個(gè)界面,先來(lái)看一下層級(jí)關(guān)系:

TabbarController作為根視圖,然后添加了一個(gè)ChildViewController,最后用戶(hù)看到內(nèi)容是ChildViewController的視圖內(nèi)容和底部的TabBar

首先我們新建一個(gè)新的工程,選擇Single View application,啟用StoryBoard,將其默認(rèn)的ViewController作為ContainerViewController,然后創(chuàng)建兩個(gè)新的ViewController,分別作為兩個(gè)childViewController,這樣目錄中就有這些文件:

我們先進(jìn)入StoryBoard拖入兩個(gè)UIButton,給兩個(gè)button設(shè)置tag:

然后創(chuàng)建兩個(gè)ViewController,這里我啟用了xib,設(shè)置一下ViewController的背景色:

這里我一個(gè)設(shè)置了綠色,還有個(gè)設(shè)置了棕色,還分別在每個(gè)ViewController上添加了UILabel,用于區(qū)分

然后進(jìn)入ContainerViewController.m,聲明以下私有變量和方法:

@interface ContainerViewController () {    FirstViewController *_firstViewController;    SecondViewController *_secondViewController;        NSMutableArray *_viewControllers;}

- (IBAction)buttonTouched:(id)sender;

FirstViewController和SecondViewController是兩個(gè)ChildViewController,_viewControllers則是保存ChildViewController的數(shù)組,再去StoryBoard關(guān)聯(lián)下點(diǎn)擊事件

在viewDidLoad中初始化:

- (void)viewDidLoad{    [super viewDidLoad];        _viewControllers = [@[] mutableCopy];    _firstViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];    _secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];        [_viewControllers addObject:_firstViewController];    [_viewControllers addObject:_secondViewController];        [self loadViewControllerAtIndex:0];}

實(shí)例化了兩個(gè)ViewController,然后將兩個(gè)ViewController添加至數(shù)組中

關(guān)鍵部分來(lái)了,loadViewControllerAtIndex用于切換視圖控制器,以下是實(shí)現(xiàn):

- (void)loadViewControllerAtIndex:(NSInteger)index {    NSInteger nextIndex = 0;    if (index == 0) {        nextIndex = 1;    } else if (index == 1) {        nextIndex = 0;    }        UIViewController *fromViewController = _viewControllers[nextIndex];// 獲取當(dāng)前viewController    UIViewController *toViewController = _viewControllers[index];// 獲取將要切換的viewController    
  //
if (self.childViewControllers.firstObject == toViewController) { return; } if (self.childViewControllers.count > 0) { self.view.userInteractionEnabled = NO;// 切換過(guò)程中禁用操作,等切換動(dòng)畫(huà)結(jié)束后恢復(fù) [fromViewController willMoveToParentViewController:nil];// fromViewController將要移除 [self addChildViewController:toViewController];// 將toViewController添加至ContainerViewController
     // 設(shè)置view的frame
if (index == 1) { toViewController.view.frame = [self nextViewStartFrame]; } else { toViewController.view.frame = [self PReViewStartFrame]; }
     // 官方提供的切換動(dòng)畫(huà)API,在這里執(zhí)行切換動(dòng)畫(huà) [self transitionFromViewController:fromViewController toViewController:toViewController duration:
0.25 options:UIViewAnimationOptionCurveEaseInOut animations:^{
         // 執(zhí)行動(dòng)畫(huà)
if (index == 1) { fromViewController.view.frame = [self preViewStartFrame]; toViewController.view.frame = [self newViewStartFrame]; } else { fromViewController.view.frame = [self nextViewStartFrame]; toViewController.view.frame = [self newViewStartFrame]; } } completion:^(BOOL finished) {
       // 動(dòng)畫(huà)執(zhí)行完畢,從父視圖添加或移除層級(jí)關(guān)系
if (finished) { [toViewController didMoveToParentViewController:self]; [fromViewController removeFromParentViewController]; self.view.userInteractionEnabled = YES; } }]; } else { [self addChildViewController:toViewController]; [self.view addSubview:toViewController.view]; [toViewController didMoveToParentViewController:self]; }}

- (CGRect)newViewStartFrame {

    returnCGRectMake(0.0, 0.0, 320.0, 500.0);

}

- (CGRect)nextViewStartFrame {

    returnCGRectMake(320.0, 0.0, 320.0, 500.0);

}

 - (CGRect)preViewStartFrame {

    returnCGRectMake(-320.0, 0.0, 320.0, 500.0);

}

這個(gè)函數(shù)用于切換視圖,使用addChildViewController把要添加的ViewController添加至ContainerViewController,移除不需要顯示的。添加一個(gè)ViewController有幾個(gè)步驟:

1. [self addChildViewController:toViewController];  添加至當(dāng)前viewController

2. [self.view addSubView:toViewController.view];   添加view至self.view中

3. [toViewController didMoveToParentViewController:self];  當(dāng)添加完成后要調(diào)用此方法來(lái)告知已經(jīng)移動(dòng)到父視圖控制器中

移除一個(gè)ViewController也有幾個(gè)步驟:

1. [fromViewController willMoveToParentViewController:nil];  參數(shù)傳入nil說(shuō)明將要移除視圖

2. [fromViewController.view removeFromSuperView];  從父視圖中移除fromViewController.view

3. [fromViewController removeFromParentViewController];  將fromViewController從父視圖層級(jí)中移除

想要添加和移除ViewController這幾個(gè)步驟是必要的,但是這里由于使用了transitionFromViewController:toViewController:duration:options:animations:completion:這個(gè)方法,它會(huì)先將toViewController.view添加至superView,然后執(zhí)行動(dòng)畫(huà),所以省略了[self.view addSubView:toViewController.view]

這樣切換函數(shù)就算完成了,然后我們實(shí)現(xiàn)按鈕事件函數(shù):

- (IBAction)buttonTouched:(id)sender {    if (((UIButton *)sender).tag == 1) {                [self loadViewControllerAtIndex:0];    } else {        [self loadViewControllerAtIndex:1];    }}

點(diǎn)擊不同的按鈕切換不同的界面,最后運(yùn)行效果如下:

這里只是大致實(shí)現(xiàn)了下切換效果,在iOS7中新增的UIViewControllerContextTransitioning和UIViewControllerAnimatedTransitioning增強(qiáng)了對(duì)自定義的切換,這篇文章做了詳細(xì)說(shuō)明http://objccn.io/issue-12-3/

demo:https://github.com/mzds/ContainHolder/tree/master

 

參考:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiphoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌鲁木齐县| 兰溪市| 柳州市| 子长县| 溧阳市| 隆子县| 基隆市| 新乐市| 波密县| 江北区| 疏附县| 九龙城区| 长汀县| 榆林市| 盘锦市| 盐边县| 辽宁省| 石楼县| 盘锦市| 无锡市| 五指山市| 玉山县| 中江县| 上高县| 克东县| 连江县| 涿州市| 石嘴山市| 红河县| 河南省| 环江| 南京市| 昌都县| 麻城市| 五家渠市| 苗栗市| 邯郸县| 武强县| 景东| 鹤庆县| 蓬莱市|