iOS8学习笔记-构建多视图应用程序

严格来说,凡是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:0];

切换方法如下

[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:0];
    }
    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:0];
    }
    [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];调用动画块开始执行

时间: 2024-08-02 03:04:37

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

我的php学习笔记:php通用采集程序

php采集程序构建基本步骤: 采集程序是什么?获取远程数据(文字.图片.图片)并快速保存到本地或指定地址. 如天气预报(小偷程序): 远程获取-->替换内容-->展示给用户 如实时更新的新闻(采集内容): 远程获取-->提取内容-->分类存储-->读取内容--->展示内容 ************************* 设计PHP采集入库UML 列表正则: 终端正则: ************************** file_get_contents()获取远

SuperSocket框架学习笔记2-构建SuperWebSocket服务器程序

SuperSocket框架学习笔记2-构建SuperWebSocket服务器程序 上一节简单介绍了 基本的SuperSocket服务器 这一节我们使用 SuperWebSocket构建一个 能与Unity3D通信的(Console控制台)服务器程序 嘎嘎 先下载   需要的  DLL类库 服务端: SuperSocket1.6.1 这个必备 http://www.supersocket.net/ SuperWebSocket 服务端必备 http://superwebsocket.codeple

《iOS应用逆向工程》学习笔记(四)iOS程序类型

越狱iOS中最常见的程序有Application, Dynamic Library和Daemon三类. 1.Application 除了传统意义上的App外,越狱iOS平台上还有两种App形式的存在:WeeApp(依附于NotificationCenter的App)和PreferenceBundle(依附于Settings的App),常见于Cydia平台. 普通App的bundle中存放的是可执行程序和所需资源,而framework的bundle中存放的是动态链接库. 主要关注App中的三个部分

c++学习笔记2(c++简单程序)

c++的简单程序 练习一: #include <iostream>int main(){std::cout<<"你好c++\n";int x;std::cin>>x;std::cout<<x;return 0;} #:预处理标志,对文本进行预处理操作:预处理标志表示该行代码要最先进行处理,要在编译器编译代码之前运行.include:预处理指令 表示将<>内的文件读入. <...>头文件iostream(输入输出流)

SuperSocket框架学习笔记3-构建Unity3D__WebSocket4Net客户端程序

确保上一节服务器程序运行没有问题,否则请仔细看上一节 新建一个Unity3D项目(我的Unity3D版本是4.2.0) 1,在Unity3D内新建一个文件夹命名 Plugin 将下载的 客户端: WebSocket4Net  客户端必备 http://websocket4net.codeplex.com/ WebSocket4Net.dll   这个DLL复制到 Unity3D里面刚才新建的 Plugin文件夹内(注意Unity不得使用中文) ----------- 查看Unity下面的状态面板

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

这周的学习笔记我想写点自己关于实验中碰到的问题和感想. 因为这次做的是白盒测试,所以我决定去测试一下上回测试的app的功能函数. 这次我用的是单元测试项目来做的白盒测试: 创建单元测试的步骤: 1.点击 “文件”->“添加”->“新建项目” 2.选择 windows应用程序-> 单元测试项目 3.在解决方案资源管理器中为单元测试项目下的引用上右击选择添加引用 4.选择解决方案下的项目中的用来测试的win8应用 接下来是单元测试的代码部分的编写了: 我要测试的是该项目中的一个字符串转化编码

Android学习笔记(43):Java开发SQLite程序

正如前面一文说的,SQLite多用于嵌入式开发中,但有时为了更方便的编辑数据库文件,我们也常常需要开发在电脑上运行的SQLite程序.这种情况是经常发生的,比如在我们需要把一大批的txt文件中的数据插入到一个数据库中的时候. 还好这是很简单的,所以本文我们来学习如何用Java开发SQLite程序. (1)准备工作 下载sqlite-jdbc-版本号.jar文件,放到jre\lib\ext文件夹.如我的路径是C:\Program Files\Java\jre1.8.0_77\lib\ext. (2

mysql学习笔记之四(视图)

视图 通过对视图的操作不仅可以实现查询的简化,而且还会提高安全性 视图: 本质是一种虚拟表,其内容和真实表相似,包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储数据值的形式存在.行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成. 视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务.这样程序员只能看到视图所定义的数据而不是视图所引用表中的数据.从而提高了数据库中数据逇安全性. 特点: 1.视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系

iOS8学习笔记2--autolayout

iOS支持的设备如今已经具有了很多的尺寸,针对这些不同的尺寸每一个都做一个独立的APP肯定是不现实的,于是苹果在iOS8之后推出了autolayout和sizeclass,同时还有VFL界面设计语言 先说一下iOS屏幕的旋转,首先,对于开发者而言,关注的并不是屏幕的像素,而是一个点的概念,也就是说,尺寸相同的设备,不同的分辨率,开发者认为他们的点是相同的,系统底层负责将一个点与对应的像素关联起来,例如ipad普通的屏幕像素为1024*768,而retina的屏幕像素为2048*1536,但是他们