iOS的UI开发中Modal的使用与主流应用UI结构介绍_IOS

Modal简单介绍
一、简单介绍

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

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

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

二、代码说明

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

YYAppDelegate.m文件

复制代码 代码如下:

//
//  YYAppDelegate.m
//  01-modal
//
//  Created by apple on 14-6-9.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYAppDelegate.h"
#import "YYViewController.h"

@implementation YYAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //1.创建window,并设置window的frame
    self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
    //2.设置window的背景颜色为黑色
    self.window.backgroundColor=[UIColor blackColor];

   
    //创建一个导航控制器作为子控制器
    YYViewController *one=[[YYViewController alloc]init];
    self.window.rootViewController=one;
   
    //3.设置window为主窗口,并显示
    [self.window makeKeyAndVisible];
    return YES;
}

@end

打开modal窗口

YYViewController.m文件

复制代码 代码如下:

//
//  YYViewController.m
//  01-modal
//
//  Created by apple on 14-6-9.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYtwoViewController.h"

@interface YYViewController ()
//当点击的时候,跳转到第二个界面
- (IBAction)jump2two:(UIButton *)sender;

@end

复制代码 代码如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (IBAction)jump2two:(UIButton *)sender {
    //创建一个新的modal并弹出
    YYtwoViewController *two=[[YYtwoViewController alloc]init];
    //在two上用导航控制器包装,让弹出的模态窗口有一个导航栏可以放返回按钮
    UINavigationController *nvc=[[UINavigationController alloc]initWithRootViewController:two
                                 ];
    [self presentViewController:nvc animated:YES completion:^{
        NSLog(@"弹出一个模态窗口");
    }];
   
}
@end

移除modal视图

YYtwoViewController.m文件

复制代码 代码如下:

//
//  YYtwoViewController.m
//  01-modal
//
//  Created by apple on 14-6-9.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYtwoViewController.h"

@interface YYtwoViewController ()

@end

复制代码 代码如下:

@implementation YYtwoViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //给导航条添加一个返回按钮
    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(change)];
}

-(void)change
{
    //编写点击返回按钮的点击事件
    //点击返回按钮,移除当前模态窗口
//    [self.navigationController dismissViewControllerAnimated:YES completion:^{
//        NSLog(@"移除模态窗口");
//    }];
   
// 如果一个控制器是以模态的形式展现出来的, 可以调用该控制器以及该控制器的子控制器让让控制器消失
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"移除");
    }];
}

@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文件

复制代码 代码如下:

//
//  YYViewController.m
//  02-模态窗口的数据传递
//
//  Created by apple on 14-6-9.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYtwoViewController.h"

@interface YYViewController ()

@end

复制代码 代码如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

/*
 如果控制器之间的关系比较紧密一般用 UINavigationController
 如果控制器之间的关系不是很紧密可以用Modal
 */

//通过segue跳转前,会调用这个方法,在这个方法中把数据传递给弹出来的模态窗口
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    //拿到目标控制器
    UINavigationController *nav=segue.destinationViewController;
    YYtwoViewController *two=(YYtwoViewController *)nav.topViewController;
    //传递数据
    two.name=@"文顶顶";
}
@end

YYtwoViewController.h文件

复制代码 代码如下:

//
//  YYtwoViewController.h
//  02-模态窗口的数据传递
//
//  Created by apple on 14-6-9.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface YYtwoViewController : UIViewController
@property(nonatomic,copy)NSString *name;
@end

YYtwoViewController.m文件

//
//  YYtwoViewController.m
//  02-模态窗口的数据传递
//
//  Created by apple on 14-6-9.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYtwoViewController.h"

@interface YYtwoViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nametext;

@end

复制代码 代码如下:

@implementation YYtwoViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.nametext.text=self.name;
   
    //为导航栏添加一个返回按钮
    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(black)];
}

-(void)black
{
    //移除模态窗口
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"成功移除!");
    }];
}
@end

APP主流UI框架结构

一、简单示例

说明:使用APP主流UI框架结构完成简单的界面搭建

搭建页面效果:

二、搭建过程和注意点

1.新建一个项目,把原有的控制器删除,添加UITabBarController控制器作为管理控制器

2.对照界面完成搭建

3.注意点:

(1)隐藏工具条:配置一个属性,Hideabotton bar在push的时候隐藏底部的bar在那个界面隐藏,就在哪个界面设置。

(2).cell可以设置行高

(3)连线

(4)说明:在上面的页面搭建中直接使用了静态单元格,但在实际开发中,通常不这么做。
(5)在tableview中添加headerview(显示一根蓝线)
三、 APP主流UI框架结构

请问:UITabBarController和导航控制器的在结构中的位置能否互调?(一个导航条)

设置控制器关联或出现问题,tableviewcontroller默认实现了数据源的方法,两个控制器把它反过来管理。关于导航条。导航条上显示什么内容由栈顶控制器来确定,下面的导航条只有一个(栈顶控制器就是tabbar控制器)。
补充说明:ios7全屏化的设计
打印ios7中控制器的层次结构:

打印ios6中控制器的层次结构:

时间: 2024-09-18 11:30:36

iOS的UI开发中Modal的使用与主流应用UI结构介绍_IOS的相关文章

解析iOS应用的UI开发中懒加载和xib的简单使用方法_IOS

懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使用懒加载的好处: (1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 (2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 3.代码示例 复制代码 代码如下: // //  YYViewController.m //

iOS应用设计模式开发中对简单工厂和工厂方法模式的运用_IOS

简单工厂模式正如此模式的名称一样,简单工厂模式基本上是所有设计模式里最简单的一种,类与类之间的关系一目了然.这次我就用很多地方经常举的例子--计算器,来说明这个模式.首先给大家展示一下类之间的结构图: 通过这张结构图,可以清晰的看到,加法类.减法类.乘法类.除法类继承自运算类,简单工厂类依赖于运算类的实例化来实现相应的运算功能,好的,看起来并不复杂,让我们直接展示一下代码吧(鉴于目前点点不支持Objective C的代码高亮,所以就直接写啦,尽量保持整齐吧.另,为了照顾像我一样基础不是很好的同学

iOS的UI开发中Button的基本编写方法讲解_IOS

一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状态 normal(普通状态) 默认情况(Default) 对应的枚举常量:UIControlStateNormal highlighted(高亮状态) 按钮被按下去的时候(手指还未松开) 对应的枚举常量:UIControlStateHighlighted disabled(失效状态,不可用状态) 如果enabled属性为NO,就是处于

iOS开发中Quartz2D控制圆形缩放和实现刷帧效果_IOS

Quartz2D简要回顾一.什么是Quartz2D  Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统  Quartz 2D能完成的工作:   绘制图形 : 线条\三角形\矩形\圆\弧等   绘制文字   绘制\生成图片(图像)   读取\生成PDF   截图\裁剪图片   自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,⾥⾯有各种各样的UI控件 UILabel:显⽰文字 UIImageView:显示图片 UIBu

iOS App开发中扩展RCLabel组件进行基于HTML的文本布局_IOS

iOS系统是一个十分注重用户体验的系统,在iOS系统中,用户交互的方案也十分多,然而要在label中的某部分字体中添加交互行为确实不容易的,如果使用其他类似Button的控件来模拟,文字的排版又将是一个解决十分困难的问题.这个问题的由来是项目中的一个界面中有一些广告位标签,而这些广告位的标签却是嵌在文本中的,当用户点击文字标签的位置时,会跳转到响应的广告页. CoreText框架和一些第三方库可以解决这个问题,但直接使用CoreText十分复杂,第三方库多注重于富文本的排版,对类似文字超链接的支

详解iOS App设计模式开发中对于享元模式的运用_IOS

享元模式的概念 在面向对象软件设计中,利用公共对象不仅能节省资源还能提高性能.共享的对象只能提供某些内在的信息,而不能用来识别对象.专门用于设计可共享对象的一种设计模式叫做享元模式(Flyweight pattern). 实现享元模式需要两个关键组件,通常是可共享的享元对象和保存他们的池.某种中央对象维护这个池,并从它返回适当的实例. 运用共享技术有效地支持大量细粒度的对象. 公共交通(如公共汽车)已有一百多年的历史了.大量去往相同方向的乘客可以分担保有和经营车辆(如公共汽车)的费用.公共汽车有

详解iOS开发中UItableview控件的数据刷新功能的实现_IOS

实现UItableview控件数据刷新一.项目文件结构和plist文件 二.实现效果 1.说明:这是一个英雄展示界面,点击选中行,可以修改改行英雄的名称(完成数据刷新的操作). 运行界面: 点击选中行: 修改数据后自动刷新: 三.代码示例 数据模型部分: YYheros.h文件 复制代码 代码如下: // //  YYheros.h //  10-英雄展示(数据刷新) // //  Created by apple on 14-5-29. //  Copyright (c) 2014年 itca

iOS开发中CAlayer层的属性以及自定义层的方法_IOS

CAlayer层的属性一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) @property CGPoint anchorPoint; 称为"定位点"."锚点" 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0,

iOS应用设计模式开发中职责链(责任链)模式的实现解析_IOS

定义为了避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,职责链模式又称为责任链模式,它是一种对象行为型模式.(如果你接触过异常处理,那么套用异常处理机制可以更好地理解). 职责链可以是一条直线,也可以是一个环,还可以是一个树形结构,不过最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处