美文网首页iOS
iOS之modal(模态)

iOS之modal(模态)

作者: SessionSinGod | 来源:发表于2016-10-13 00:33 被阅读1630次

    一、简单介绍

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

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

    Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为⽌

    二、代码实现

    1.在当前控制器中写弹出modal窗口的代码

    - (IBAction)jump2two:(UIButton *)sender {

         //创建一个新的modal并弹出

        YYtwoViewController *two=[[YYtwoViewController alloc]init];

        //在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮                               UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two];

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

           NSLog(@"弹出一个模态窗口");

        }];

    }    

    2.使模态窗口消失要在弹出的模态窗口的控制器中写以下代码

    -(void)change{

         //如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让控制器消失

        [self dismissViewControllerAnimated:YES completion:^{

            NSLog(@"移除");

        }];

    }

    三、何时使用

    在实际的开发中,如果控制器之间的关系紧密一般用导航控制器,如果控制器之间的关系不是很紧密就用modal

    四、内部机制

    (1)弹出之后,window上面只有一个子视图。

    (2)虽然当前界面上展示在我们眼前的时twoview,但是window的根控制器仍然是NJviewController,它并没有切换window的根控制器,而仅仅只是换了window上面显示的视图。

    (3)移除的视图并没有销毁,因为控制器并没有销毁,所以控制器对应的view也没有销毁。

    (4)在模态弹出(完全显示后),在方法中传入two作为参数,默认就有一个控制器强引用着它。

    (5)当向下移除之后,只要调用了控制器的dismiss方法让窗口关闭,modal就释放了。

    (6)通常弹出的模态窗口都会提供一个导航条,让界面拥有导航条的最快的方式是给它包装一个导航控制器。

    (7)如果一个控制器是以模态的形式展现出来的。可以调用该控制器以及该控制器的子控制器,让该控制器消失。

    五、一开始就介绍了,模态窗口默认是从下向上弹出的。其实模态窗口还有其他的弹出方式

    直接上代码:

       SecondViewController*second = [[SecondViewControlleralloc]init];

       second.view.backgroundColor= [UIColorredColor];

       /**

       modal 的控制的的 view 的尺寸  

       UIModalPresentationFullScreen = 0, // - 满屏

       UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2),// - 弹出的菜单

       UIModalPresentationFormSheet NS_ENUM_AVAILABLE_IOS(3_2),- 弹出的菜单

       */

       //只针对iPad,对iPhone不适用

       second.modalPresentationStyle=UIModalPresentationFormSheet;

       /**

       modal 控制的的动画样式

       UIModalTransitionStyleCoverVertical = 0,

       UIModalTransitionStyleFlipHorizontal,//翻转

       UIModalTransitionStyleCrossDissolve,//淡入淡出

       UIModalTransitionStylePartialCurl  // - 翻页

       */

       second.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;

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

    五、其他

       UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),//原来的不隐藏

       UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0)//原来的不隐藏

    UIViewController的modalPresentationStyle的上面两个值是可以让原来的控制器view不消失,保持在弹出的控制器的下面,可以用来实现酷狗音乐的转场动画。

    相关文章

      网友评论

      • 睿少:modal 可以从上弹出吗?从上到下的弹出?
        睿少:@爱跑步爱旅游 哦,好的,谢谢!
        码渣:- (void)customPresent:(UIViewController *)viewControler{

        viewControler.view.center = CGPointMake(self.view.bounds.size.width + self.view.center.x, self.view.center.y);

        [self.view addSubview:viewControler.view];
        [self addChildViewController:viewControler];//self持有viewController

        [UIView animateWithDuration:0.5 animations:^{

        viewControler.view.center = self.view.center;
        } completion:^(BOOL finished) {

        if (finished) {

        NSLog(@"动画执行完毕");
        }
        }];
        }

        - (void)customDismiss{

        [UIView animateWithDuration:0.5 animations:^{

        self.view.center = CGPointMake(self.view.bounds.size.width + self.view.center.x ,self.view.center.y);
        } completion:^(BOOL finished) {

        if (finished) {

        [self.view removeFromSuperview];
        [self removeFromParentViewController];
        }
        }];
        }
        这个方法可以自定义类似于从上到下的弹出
        码渣:这个完全可以的 需要自定义从上到下的方向

      本文标题:iOS之modal(模态)

      本文链接:https://www.haomeiwen.com/subject/grqwyttx.html