zoukankan      html  css  js  c++  java
  • Present ViewController Modally

    一、主要用途

    弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等。弹出模态ViewController主要使用于一下这几种情形:

    1、收集用户输入信息

    2、临时呈现一些内容

    3、临时改变工作模式

    4、相应设备方向变化(用于针对不同方向分别是想两个ViewController的情况)

    5、显示一个新的view层级

    这几种情形都会暂时中断程序正常的执行流程,主要作用是收集或者显示一些信息。

    二、几个概念和常用设置

    1、presenting view controller Vs presented view controller

    当我们在view controller A中模态显示view controller B的时候,A就充当presenting view controller(弹出VC),而B就是presented view controller(被弹出VC)。官方文档建议这两者之间通过delegate实现交互,如果使用过UIImagePickerController从系统相册选取照片或者拍照,我们可以发现imagePickerController和弹出它的VC之间就是通过UIImagePickerControllerDelegate实现交互的。因此我们在实际应用用,最好也遵守这个原则,在被弹出的VC中定义delegate,然后在弹出VC中实现该代理,这样就可以比较方便的实现两者之间的交互。

    2、Modal Presentation Styles(弹出风格)

    通过设置presenting VC的modalPresentationStyle属性,我们可以设置弹出View Controller时的风格,有以下四种风格,其定义如下:

    typedef enum {
        UIModalPresentationFullScreen = 0,
        UIModalPresentationPageSheet,
        UIModalPresentationFormSheet,
        UIModalPresentationCurrentContext,
    } UIModalPresentationStyle;

    UIModalPresentationFullScreen代表弹出VC时,presented VC充满全屏,如果弹出VC的wantsFullScreenLayout设置为YES的,则会填充到状态栏下边,否则不会填充到状态栏之下。

    UIModalPresentationPageSheet代表弹出是弹出VC时,presented VC的高度和当前屏幕高度相同,宽度和竖屏模式下屏幕宽度相同,剩余未覆盖区域将会变暗并阻止用户点击,这种弹出模式下,竖屏时跟UIModalPresentationFullScreen的效果一样,横屏时候两边则会留下变暗的区域。

    UIModalPresentationFormSheet这种模式下,presented VC的高度和宽度均会小于屏幕尺寸,presented VC居中显示,四周留下变暗区域。

    UIModalPresentationCurrentContext这种模式下,presented VC的弹出方式和presenting VC的父VC的方式相同。

    这四种方式在iPad上面统统有效,但在iPhone和iPod touch上面系统始终已UIModalPresentationFullScreen模式显示presented VC。

    3、Modal Transition Style(弹出时的动画风格)

    通过设置设置presenting VC的modalTransitionStyle属性,我们可以设置弹出presented VC时场景切换动画的风格,其定义如下:

    typedef enum {
            UIModalTransitionStyleCoverVertical = 0,
            UIModalTransitionStyleFlipHorizontal,
            UIModalTransitionStyleCrossDissolve,
            UIModalTransitionStylePartialCurl,
    } UIModalTransitionStyle;

    我们可以看到有从底部滑入,水平翻转进入,交叉溶解以及翻页这四种风格可选。这四种风格在不受设备的限制,即不管是iPhone还是iPad都会根据我们指定的风格显示转场效果。

    4、Dismiss Modal ViewController(消失弹出的VC)

    消失presented VC,我们可以通过调用以下两个函数中的任何一个来完成

    dismissModalViewControllerAnimated:                 // 将要废弃,不赞成继续使用
    dismissViewControllerAnimated:completion:

    谁来调用这消失presented VC的这个方法:正确的做法是“谁污染谁治理”,即presenting VC调用上面的方法来取消presented VC的显示。这样做有一个好处,如果一个VC真不用户做的不同选择可能弹出不同的view controller,当不再需要显示被弹出的view controller的时候,直接调用[self dismissModalViewControllerAnimated]即可使之消失,而不用去关心其具体显示的哪一类view controller。当然系统在这里做了优化,当我们在presented VC里面调用上面的方法的时候,系统会自动的将这个消息传递到相应的presenting VC中,这样就可以实现不管谁弹出了自己,当不再需要的时候直接将自己消失掉的功能。在应用中具体要采用那种要看具体情况,如果presented VC需要和presenting VC有数据传递的话,建议在presenting VC实现的代理函数中dismiss弹出的view controller。

    《个人小实验》

     

    1. //  
    2. //  ViewController.m  
    3. //  ModalPresent  
    4. //  
    5. //  Created by Yongchao Zhang on 12-9-16.  
    6. //  Copyright (c) 2012年 Yongchao Zhang. All rights reserved.  
    7. //  
    8.   
    9. #import "ViewController.h"  
    10. #import "TestViewController.h"  
    11.   
    12. @interface ViewController ()  
    13.   
    14. @end  
    15.   
    16. @implementation ViewController  
    17.   
    18. - (void)viewDidLoad  
    19. {  
    20.     [super viewDidLoad];  
    21.     // Do any additional setup after loading the view, typically from a nib.  
    22.     testViewController = [[TestViewController alloc] init];  
    23.       
    24.     for(int i = 0; i < 4; i++){  
    25.         UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
    26.         //[btn setFrame:CGRectMake(i%ekLineOfButton*ekBtnSpace+10, i/ekLineOfButton*30+10, 25, 24)];  
    27.         [button setFrame:CGRectMake((i * 2 * 100)+50, 50, 100, 100)];  
    28.         button.tag = i;  
    29.         [button setTitle:@"弹出视图" forState:UIControlStateNormal];  
    30.         [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];  
    31.           
    32.         [self.view addSubview:button];  
    33.     }   
    34. }  
    35.   
    36.   
    37. //typedef enum {  
    38. //    UIModalTransitionStyleCoverVertical = 0,  
    39. //    UIModalTransitionStyleFlipHorizontal,  
    40. //    UIModalTransitionStyleCrossDissolve,  
    41. //#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2  
    42. //    UIModalTransitionStylePartialCurl,  
    43. //#endif  
    44. //} UIModalTransitionStyle;  
    45. //  
    46. //typedef enum {  
    47. //    UIModalPresentationFullScreen = 0,  
    48. //#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2  
    49. //    UIModalPresentationPageSheet,  
    50. //    UIModalPresentationFormSheet,  
    51. //    UIModalPresentationCurrentContext,  
    52. //#endif  
    53. //} UIModalPresentationStyle;  
    54.   
    55.   
    56. -(void)buttonClick:(id)sender{  
    57.     UIButton *button = (UIButton *)sender;  
    58.     switch (button.tag) {  
    59.         case 1:  
    60.         {  
    61.             testViewController.modalPresentationStyle = UIModalPresentationFullScreen;  
    62.             testViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;  
    63.         }  
    64.             break;  
    65.         case 2:  
    66.         {  
    67.             testViewController.modalPresentationStyle = UIModalPresentationPageSheet;  
    68.             testViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  
    69.         }  
    70.             break;  
    71.         case 3:  
    72.         {  
    73.             testViewController.modalPresentationStyle = UIModalPresentationFormSheet;  
    74.             testViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;  
    75.         }  
    76.             break;  
    77.         case 4:  
    78.         {  
    79.             testViewController.modalPresentationStyle = UIModalPresentationCurrentContext;  
    80.             testViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;  
    81.         }  
    82.             break;  
    83.               
    84.         default:  
    85.             break;  
    86.     }  
    87.     [self presentModalViewController:testViewController animated:YES];  
    88. }  
    89.   
    90.   
    91.   
    92. - (void)viewDidUnload  
    93. {  
    94.     [super viewDidUnload];  
    95.     // Release any retained subviews of the main view.  
    96. }  
    97.   
    98. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
    99. {  
    100.     return YES;  
    101. }  
    102.   
    103. @end  


    要关闭只需要在关闭的时间里面加入:

     

    [selfdismissModalViewControllerAnimated:YES];

    即可实现。

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3295247.html
Copyright © 2011-2022 走看看