另一种控制器切换的方式→Modal

来源:互联网 发布:国产好电影 知乎 编辑:程序博客网 时间:2024/06/05 13:27

 

 

除了push之外,还有另外一种控制器的切换方式,那就是Modal。

一、Push和Modal的区别:

1> 只有受UINavigationController管理的控制器才能用push

        任何控制器都能通过Modal的形式展示出来。

2> 当控制器A跳转到控制器B,两者之间有关系的时候,用push,否则用Modal

补充:基本上所有移动端app弹出的登录界面都是用Modal来展示的。

二、控制器之间切换之Modal的实现方法:

1> Modal和dismissViewController两个方法

以Modal的形式展示控制器

-(void)presentViewController:(UIViewController*)viewControllerToPresent animated: (BOOL)flag completion:(void(^)(void))completion

关闭上面Modal出来的控制器

-(void)dismissViewControllerAnimated: (BOOL)flagcompletion: (void (^)(void))completion;

2> Modal的效果:

默认效果:

新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止。

其他效果设置:

a. 在Main.storyboard中设置

在Main.storyboard中的连线只需选择Modal即可,Modal的效果,并且可以通过segue(即连线)的参数Transition来修改;

   

b. 代码实现设置

在代码实现Modal的时候,只需要在跳转控制器的时候加上效果,即

系统提供的Modal效果是个枚举,有四种:

typedefNS_ENUM(NSInteger, UIModalTransitionStyle) {

    UIModalTransitionStyleCoverVertical = 0,

    UIModalTransitionStyleFlipHorizontal,

    UIModalTransitionStyleCrossDissolve,

    UIModalTransitionStylePartialCurl

};

TestViewController *t = [[TestViewController alloc]init];

UINavigationController *nc=[[UINavigationController alloc]initWithRootViewController:t];

t.modalTransitionStyle =UIModalTransitionStyleFlipHorizontal;

[self presentViewController:nc animated:YES completion:^{

NSLog(@"我被调用了");

}];

三、其他知识总结:

1> 关于dismissViewControllerAnimated:方法的理解:

1)如果控制器A弹出控制器B,那么就应该由控制器A来关闭控制器B;

2)如果在控制器B里调用dismissViewControllerAnimated: 方法,那么控制器B会先发消息给控制器A,让控制器A来dismiss控制器B;

2> Modal实现跳转的同时弹出的控制器顶部添加一个UINavigationBar的实现方法

a.描述:

如果控制器A来弹出控制器B(B为普通控制器)的时候,控制器B的顶部显示了一个UINavigationBar。

b.实现方法:

将控制器B包装成一个导航控制器UINavigationController,并且让控制器A跳转的时候不要跳转到控制器B,而是跳转到UINavigationController上即可。

包装前的代码展示:

   TestViewController *t= [[TestViewController alloc] init];

    [selfpresentViewController:tanimated:YES completion:^{

       NSLog(@"弹出控制器t");

}];

包装后的代码展示:

   TestViewController *t= [[TestViewController alloc] init];

    UINavigationController *nc  = [[UINavigationController alloc]initWithRootViewController:t];

    [selfpresentViewController:ncanimated:YES completion:^{

       NSLog(@"弹出导航控制器nc ");

    }];

结果截图对比如下:

 

3> Modal的补充:

a. popViewControllerAnimated:和dismissViewControllerAnimated:方法只能用代码来实现跳转,不能在Main.storyboard中实现;

b. 当多个(例如3个)控制器使用Modal方法的时候的规则:

当前控制器在执行dismissViewControllerAnimated:之前会先去看自己有没有弹出其他控制器,如果有,关闭由自己弹出的控制器,dismiss结束;

否则,往前(即弹出自己的那个控制器)去发消息,由前一个控制器来关闭自己,dismiss结束。

 

 

0 0