严格来说,凡是UIView的子类都可以称为视图,实际上IOS的图形界面就是视图包含视图的方案,绝大多数的控件都是UIView的子类,但是苹果公司定义的视图术语,通常是指具有相应视图控制器的uiview及其子类,MVC架构嘛,因此这些视图有时候也被称为内容视图

第一种常见的多视图是基于导航的应用程序,该类程序拥有一个导航控制器,使用导航栏来控制一系列分层的视图,如iphone的设置应用程序,导航控制器跟踪所在的视图深度,并且向你提供控制权,让你可以回到之前的视图,在希望显示具有不同层次结构的视图时就可以使用这种基于导航的应用形式

第二种常见的多视图是标签栏,它在屏幕底部显示一行按钮,称之为标签栏,单击某个按钮就能激活一个新的视图控制器,并显示一个新的视图

另外,这两种视图交换控制机制不是绝对独立的,应为视图本质上是分层的,所以完全可以在一个应用程序中使用不同的视图交换机制,结合标签栏,导航栏一起来对应用程序的逻辑进行控制

一些应用程序使用了工具栏,工具栏的样子和标签栏差不多,但是他们有本质上的区别,标签栏用于从两个或者更多选项中选择一个,而且只能选择一个,工具栏可以包含一些按钮和一些控件

所有的多视图应用程序都是使用的UIKit提供的某个具体的控制器类,比如标签栏界面使用的是UITabBarController类实现,导航界面使用UINavigationController类实现

对于负责管理向当前用户显示哪个界面的的控制器,我们称之为根控制器,这个根控制器通常是UINavigationController或者UITabBarController的子类,也可以是UIViewController的自定义子类

标签栏应用程序中,点击标签栏将会跳转到对应的标签栏控制器中,但是点击屏幕其他位置,都会转到与当前现实的内容视图相对应的控制器中

使用标签栏应用程序,第一步是应用程序委托,在didFinishLuanchingWithOptions函数中将标签控制器作为程序window主控制器,代码如下

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];//创建window
self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"SwitchViewController" bundle:nil];//创建主视图控制器
UIView* switchView = self.switchViewController.view;//得到主视图控制器的view
CGRect switchViewFrame = switchView.frame;//得到view的frame大小
switchViewFrame.origin.y += [UIApplication sharedApplication].statusBarFrame.size.height;
switchView.frame = switchViewFrame;//调整几何属性,以免被隐藏在状态栏后面
self.window.rootViewController = self.switchViewController;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible]; return YES;

工具栏上的按钮与其他iOS控件不同,他们只支持一个目标动作方法,并且只在特定时刻触发,相当于button的touch upside

当切换标签被按下的时候触发切换方法,同时还应该重新定义viewDidLoad方法,如下

 self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil];
[self.view insertSubview:self.blueViewController.view atIndex:];

切换方法如下

[UIView beginAnimations:@"View" context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; if(self.yellowViewController.view.superview == nil)
{
if(self.yellowViewController == nil)
{
self.yellowViewController = [[YellowViewController alloc] initWithNibName:@"YellowViewController" bundle:nil]; }
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES]; [self.blueViewController.view removeFromSuperview];
[self.view insertSubview:self.yellowViewController.view atIndex:];
}
else
{
if(self.blueViewController == nil)
{
self.blueViewController = [[BlueViewController alloc] initWithNibName:@"BlueViewController" bundle:nil];
}
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.yellowViewController.view removeFromSuperview];
[self.view insertSubview:self.blueViewController.view atIndex:];
}
[UIView commitAnimations];

接下来还需要实现didReceiveMemoryWarning方法,当内存减少到一个一个设定的水平的时候,操作系统发送给应用

    if(self.blueViewController.view.superview == nil)
{
self.blueViewController = nil;
}
else
{
self.yellowViewController = nil;
}

做内存管理

关于视图转换时候的动画效果

iOS的动画效果使用core animation组件,包括

1.

[UIView beginAnimations:@"View" context:NULL];第一个参数为动画块标题,第二个为连接到动画块的对象

2.

[UIView setAnimationDuration:0.5];

指定动画块的持续时间

3.

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

指定动画块效果

4.

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];

指定动画块缓存,这样使用动画块的时候就可以使用这个缓存

5.

[UIView commitAnimations];调用动画块开始执行

iOS8学习笔记-构建多视图应用程序的更多相关文章

  1. Spring实战第五章学习笔记————构建Spring Web应用程序

    Spring实战第五章学习笔记----构建Spring Web应用程序 Spring MVC基于模型-视图-控制器(Model-View-Controller)模式实现,它能够构建像Spring框架那 ...

  2. Spring实战第六章学习笔记————渲染Web视图

    Spring实战第六章学习笔记----渲染Web视图 理解视图解析 在之前所编写的控制器方法都没有直接产生浏览器所需的HTML.这些方法只是将一些数据传入到模型中然后再将模型传递给一个用来渲染的视图. ...

  3. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  4. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

  5. C#.NET学习笔记2---C#.第一个C#程序

    C#.NET学习笔记2---C#.第一个C#程序 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 6.第一个C#程序:   ...

  6. 20180821 Python学习笔记:如何获取当前程序路径

    20180821 Python学习笔记:如何获取当前程序路径 启动的脚本的路径为:D:\WORK\gitbase\ShenzhenHouseInfoCrawler\main.py 当前脚本的路径为:D ...

  7. 软件测试第六周学习笔记之“Win8 APP应用程序的白盒测试”

    这周的学习笔记我想写点自己关于实验中碰到的问题和感想. 因为这次做的是白盒测试,所以我决定去测试一下上回测试的app的功能函数. 这次我用的是单元测试项目来做的白盒测试: 创建单元测试的步骤: 1.点 ...

  8. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  9. blfs(systemd版本)学习笔记-构建gnome桌面系统

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 大概思路: lfs(系统)+xorg(驱动)+gnome(桌面组件) 链接: lfs(systemd版本)学习笔记系列:http ...

随机推荐

  1. 在idea的maven项目使用el或jstl表达式

    必须加上这句: <%@ page isELIgnored="false" %> 否则无法解析el或jstl表达式 <%@ taglib prefix=" ...

  2. idea控制台输出乱码

    找到安装目录bin下面的idea64.exe.vmoptions,打开后在最后一行增加 -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeC ...

  3. Webdriver中实现区域截图的方式以及如何截取frame中的图片

    import java.awt.Rectangle;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOE ...

  4. gameUnity 0.15 beta 网络游戏框架

    增加了 换人 和换衣服 ,加入了动画事件.beta版本 0.15测试版本 目前就到此,正式版本 会在7月底  和 0.2版本一起推出.届时,换装系统 将不仅仅是 换装备,而是有 换装后 打怪的体验,更 ...

  5. HDU 4460 Friend Chains(map + spfa)

    Friend Chains Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

  6. HDU 4828 Grids(卡特兰数+乘法逆元)

    首先我按着我的理解说一下它为什么是卡特兰数,首先卡特兰数有一个很典型的应用就是求1~N个自然数出栈情况的种类数.而这里正好就对应了这种情况.我们要满足题目中给的条件,数字应该是从小到大放置的,1肯定在 ...

  7. JS中substr和substring的用法和区别

    substr 和 substring都是JS 截取字符串函数,两者用法很相近,下面是两者的语法很示例: substr 方法 返回一个从指定位置开始的指定长度的子字符串.stringvar.substr ...

  8. linux找回密码

    开机启动系统,在进入系统之前按键盘上面的Esc键,会进入下面的界面 按键盘上的e键,出现下面界面 用键盘上的方向键移动光标到第二项,然后再按键盘上面的e,会出现下面的界面 输入一个空格键,然后在输入数 ...

  9. 剑指offer 链表中倒数第K个节点

    利用两个间隔为k的指针来实现倒数第k个 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

  10. C++设计模式-单件

    理解 1.       Singleton模式用来取代全局静态变量.C++通过静态成员变量来实现类实例全局唯一性. 2.       instance()方法是单件提供的唯一调用入口.   要点 1. ...