iOS开发UI篇—Modal简单介绍

简介: iOS开发UI篇—Modal简单介绍 一、简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为⽌ 二、代码说明 新建一个项目,在Application的代理中添加window和控制器。

iOS开发UI篇—Modal简单介绍

一、简单介绍

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

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

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

二、代码说明

新建一个项目,在Application的代理中添加window和控制器。

YYAppDelegate.m文件

 1 //
 2 //  YYAppDelegate.m
 3 //  01-modal
 4 //
 5 //  Created by apple on 14-6-9.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYAppDelegate.h"
10 #import "YYViewController.h"
11 
12 @implementation YYAppDelegate
13 
14 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
15 {
16     //1.创建window,并设置window的frame
17     self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
18     //2.设置window的背景颜色为黑色
19     self.window.backgroundColor=[UIColor blackColor];
20 
21     
22     //创建一个导航控制器作为子控制器
23     YYViewController *one=[[YYViewController alloc]init];
24     self.window.rootViewController=one;
25     
26     //3.设置window为主窗口,并显示
27     [self.window makeKeyAndVisible];
28     return YES;
29 }
30 
31 
32 @end

打开modal窗口

YYViewController.m文件

 1 //
 2 //  YYViewController.m
 3 //  01-modal
 4 //
 5 //  Created by apple on 14-6-9.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "YYtwoViewController.h"
11 
12 @interface YYViewController ()
13 //当点击的时候,跳转到第二个界面
14 - (IBAction)jump2two:(UIButton *)sender;
15 
16 @end
17 
18 @implementation YYViewController
19 
20 - (void)viewDidLoad
21 {
22     [super viewDidLoad];
23     // Do any additional setup after loading the view from its nib.
24 }
25 
26 
27 - (IBAction)jump2two:(UIButton *)sender {
28     //创建一个新的modal并弹出
29     YYtwoViewController *two=[[YYtwoViewController alloc]init];
30     //在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮
31     UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two
32                                  ];
33     [self presentViewController:nvc animated:YES completion:^{
34         NSLog(@"弹出一个模态窗口");
35     }];
36     
37 }
38 @end

移除modal视图

YYtwoViewController.m文件

 1 //
 2 //  YYtwoViewController.m
 3 //  01-modal
 4 //
 5 //  Created by apple on 14-6-9.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYtwoViewController.h"
10 
11 @interface YYtwoViewController ()
12 
13 @end
14 
15 @implementation YYtwoViewController
16 
17 - (void)viewDidLoad
18 {
19     [super viewDidLoad];
20 
21     //给导航条添加一个返回按钮
22     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(change)];
23 }
24 
25 -(void)change
26 {
27     //编写点击返回按钮的点击事件
28     //点击返回按钮,移除当前模态窗口
29 //    [self.navigationController dismissViewControllerAnimated:YES completion:^{
30 //        NSLog(@"移除模态窗口");
31 //    }];
32     
33 // 如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让让控制器消失
34     [self dismissViewControllerAnimated:YES completion:^{
35         NSLog(@"移除");
36     }];
37 }
38 
39 @end

三、注意点

(1)modal的特点:当modal窗口弹出(从下往上)的时候,后面的视图不可点 
(2)弹出控制器的视图(通过这种方式只能弹出一个视图)
   //创建一个新的modal并弹出
    YYtwoViewController *two=[[YYtwoViewController alloc]init];
    //在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮
    UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two
                                 ];
    [self presentViewController:nvc animated:YES completion:^{
        NSLog(@"弹出一个模态窗口");
    }];
(3)移除控制器的视图(两种方式都可以)
    //编写点击返回按钮的点击事件
    //点击返回按钮,移除当前模态窗口
//    [self.navigationController dismissViewControllerAnimated:YES completion:^{
//        NSLog(@"移除模态窗口");
//    }];
    
// 如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让让控制器消失
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"移除");
    }];
(4)提示在实际的开发中,如果控制器之间的关系紧密一般用导航控制器,如果控制器之间的关系不是很紧密就用modal
 
四、内部机制
(1)弹出之后,window上面只有一个子视图。
(2)虽然当前界面上展示在我们眼前的时twoview,但是window的根控制器仍然是NJviewController,它并没有切换window的根控制器,而仅仅只是换了window上面显示的视图。
(3)移除的视图并没有销毁,因为控制器并没有销毁,所以控制器对应的view也没有销毁。
(4)在模态弹出(完全显示后),在方法中传入two作为参数,默认就有一个控制器强引用着它。
(5)当向下移除之后,只要调用了控制器的dismiss方法让窗口关闭,modal就释放了。
(6)通常弹出的模态窗口都会提供一个导航条,让界面拥有导航条的最快的方式是给它包装一个导航控制器。
(7)如果一个控制器是以模态的形式展现出来的。可以调用该控制器以及该控制器的子控制器,让该控制器消失。
 

五、数据的传递

项目文件结构和storyboard

代码示例:

YYViewController.m文件

 1 //
 2 //  YYViewController.m
 3 //  02-模态窗口的数据传递
 4 //
 5 //  Created by apple on 14-6-9.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 #import "YYtwoViewController.h"
11 
12 @interface YYViewController ()
13 
14 @end
15 
16 @implementation YYViewController
17 
18 - (void)viewDidLoad
19 {
20     [super viewDidLoad];
21 }
22 
23 - (void)didReceiveMemoryWarning
24 {
25     [super didReceiveMemoryWarning];
26 }
27 
28 
29 /*
30  如果控制器之间的关系比较紧密一般用 UINavigationController
31  如果控制器之间的关系不是很紧密可以用Modal
32  */
33 
34 //通过segue跳转前,会调用这个方法,在这个方法中把数据传递给弹出来的模态窗口
35 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
36 {
37     //拿到目标控制器
38     UINavigationController *nav=segue.destinationViewController;
39     YYtwoViewController *two=(YYtwoViewController *)nav.topViewController;
40     //传递数据
41     two.name=@"文顶顶";
42 }
43 @end

YYtwoViewController.h文件

 1 //
 2 //  YYtwoViewController.h
 3 //  02-模态窗口的数据传递
 4 //
 5 //  Created by apple on 14-6-9.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import <UIKit/UIKit.h>
10 
11 @interface YYtwoViewController : UIViewController
12 @property(nonatomic,copy)NSString *name;
13 @end

YYtwoViewController.m文件

 1 //
 2 //  YYtwoViewController.m
 3 //  02-模态窗口的数据传递
 4 //
 5 //  Created by apple on 14-6-9.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYtwoViewController.h"
10 
11 @interface YYtwoViewController ()
12 @property (weak, nonatomic) IBOutlet UILabel *nametext;
13 
14 @end
15 
16 @implementation YYtwoViewController
17 
18 
19 - (void)viewDidLoad
20 {
21     [super viewDidLoad];
22     self.nametext.text=self.name;
23     
24     //为导航栏添加一个返回按钮
25     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(black)];
26 }
27 
28 -(void)black
29 {
30     //移除模态窗口
31     [self dismissViewControllerAnimated:YES completion:^{
32         NSLog(@"成功移除!");
33     }];
34 }
35 @end

 

目录
相关文章
|
7天前
|
Android开发 缓存 双11
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
android的基础ui组件,Android开发社招面试经验
|
9天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
9天前
UI开发第四篇——实现像handcent sms或者chomp sms那样的气泡
UI开发第四篇——实现像handcent sms或者chomp sms那样的气泡
12 2
|
9天前
|
前端开发 测试技术 持续交付
【Flutter 前端技术开发专栏】Flutter 中的 UI 测试与自动化测试
【4月更文挑战第30天】本文探讨了 Flutter 应用中UI测试和自动化测试的重要性,包括保障质量、提高效率和增强开发信心。Flutter提供`flutter_test`库进行Widget测试,以及`flutter_driver`进行集成测试。UI测试涵盖界面布局、交互和状态变化的验证,最佳实践建议尽早引入测试、保持用例简洁,并结合手动测试。未来,随着Flutter技术发展,UI测试和自动化测试将更加完善,助力开发高质量应用。
【Flutter 前端技术开发专栏】Flutter 中的 UI 测试与自动化测试
|
9天前
|
前端开发 搜索推荐 UED
【Flutter前端技术开发专栏】Flutter中的高级UI组件应用
【4月更文挑战第30天】探索Flutter的高级UI组件,如`TabBar`、`Drawer`、`BottomSheet`,提升应用体验和美观度。使用高级组件能节省开发时间,提供内置交互逻辑和优秀视觉效果。示例代码展示了如何实现底部导航栏、侧边导航和底部弹出菜单。同时,自定义组件允许个性化设计和功能扩展,但也带来性能优化和维护挑战。参考Flutter官方文档和教程,深入学习并有效利用这些组件。
【Flutter前端技术开发专栏】Flutter中的高级UI组件应用
|
9天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
40 0
|
9天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
9天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
9天前
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
24 2
|
9天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
24 0