《iOS创意程序设计家》——第6.1节 界面的管理

6.1 界面的管理
iOS创意程序设计家
UIViewController提供了对于iOS应用程序的基本界面管理模式,包括界面的呈现、Modal窗口界面的管理以及iOS设备旋转后界面旋转的支持等。

每个UIViewController都会对应到一个唯一的UIView,这表示这个界面由相对应的UIViewCon-
troller所控制。如同我们在前一章所提到的,在UIViewController类中,有一个view的属性,而UIViewController正是通过这个属性才得以与其管理的界面关联起来。在iPhone与iPod Touch中,这个关联的底层界面通常占有整个屏幕的大小;然而在iPad中,这个底层界面可能只占一小部分而已。

除了对界面的管理外,其实UIViewController跟UIView一样,都是UIResponder这个类的子类。因为UIViewController也会负责事件的处理,事实上,在大部分时候,我们也都会用UIViewController来处理这些事件。

iOS SDK为不同的界面需求提供了相对应的界面控制器。例如,为了在界面上显示表格控件UITable-
View,就必须使用相对应的界面控制器UITableViewController;为了做出导航栏的应用程序,就必须使用UINavigationController等。此外,在iOS应用程序中,界面的切换通常也伴随着界面控制器的切换,在本章后续的内容里面,我们会提到如何做到这一点。

6.1.1 界面方向的管理
界面控制器也同时控制着界面方向的改变。例如,当我们在使用Safari来浏览网页的时候,界面会随着手机方向而改变,这就是界面控制器在起作用。如果要让手机可以支持方向的改变,那么应该去改写UIViewController里面的shouldAutorotateToInterfaceOrientation:这个方法。如果希望手机可以支持“Home”键在左边的风景模式以及“Home”键在右边的风景模式,那么可以将这个方法改写如下。

-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) orientation  {
    return (orientation==UIInterfaceOrientationLandscapeLeft) ||
        (orientation== UIInterfaceOrientationLandscapeRight);
}
其他可能的方向:

UIInterfaceOrientationPortrait:肖像模式。

UIInterfaceOrientationPortraitUpsideDown:“Home”键上的肖像模式。

6.1.2 内存使用的管理
由于界面控制器控制着它所使用的界面,在内存不足的时候,界面控制器的didReceiveMemoryWarning方法就会被调用,这时候您可以在这个方法内释放不需要使用的资源,这其中包括界面控件。对于iOS 3.0之后的版本,您应该在viewDidUnload方法中释放掉不需要使用的界面控件。如果在界面控制器中包括了一些Outlet的使用,那么您也应该在这个方法中将这些Outlet设置为nil以便释放它们。

6.1.3 界面的加载流程
在设计界面上,所有的界面都是以View Controller为单位的。也就是说,不管使用故事板或是XIB来产生界面,每一个手机的界面背后都有一个View Controller来控制着界面。因此,当系统加载了这些.xib或.storyboard的文件后,其实也一并加载了界面控制器。这个加载的过程跟我们日后编写程序的时候有很大的关联性,所以一定得知道这一过程中发生了哪些事情。

从UIViewController类的定义里面,我们可以得知它遵循着NSCoding这个协议。而这个协议就是在XIB加载后,可以把XIB文件里面的东西转化为对象的关键所在。当每一个XIB文件载入后,就会开始解析文件里面的每个对象,并且对表示这个XIB文件的File's Owner(对故事板来说,就是每个界面的View Controller类)发送NSCoding协议里面的initWithCoder:信息,以通知File's Owner“现在我正要开始解析这个文件了”。因此,如果您的File's Owner是一个UIViewController,那么请不要在这个方法访问Outlet,因为在这个时候,这些Outlet还没有与类连接起来,也就是说您访问到的Outlet只是个nil。

接下来,XIB的加载器会准备将Outlet以及Action与类连接起来,并对XIB里面的对象发送awake-FromNib的信息。如果XIB里面包含了UIView,那么当UIView接收到awakeFromNib的信息之后,就会产生UIView的实例,并调用UIViewController的viewDidLoad方法。只有在这个方法调用之后,才可以访问界面控制器的Outlet。这就是为什么在前面几章的例子中,我们会尽量将访问Outlet的程序代码放在viewDidLoad里面。在viewDidLoad之后则依次发生viewWillAppear以及viewDidAppear事件。

现在问题来了,如果我们是通过程序代码的方式来产生界面控制器与界面的,那么UIView又是如何与UIViewController产生关联的呢?下面解答这个问题,我们可以看到在控制器里面有个view的属性,可以通过这个属性来设置这个控制器所管理的界面。如果是通过XIB的方式加载的,那么,XIB的加载器会把上面的流程所产生UIView的实例自动设置为UIViewController的view属性。但如果不是通过XIB的方式来加载控制器,那么您应该自己重载控制器的–(void) loadView方法,然后在这个方法中产生一个UIView的对象,并将其设置为这个控制器的view属性;否则,您在界面上将看不到任何东西。

6.1.4 常见接口模式
仔细观察一下在App Store上的应用程序,您应该会发现它们外观的布局似乎都有点雷同。其实这是因为Apple已经帮助开发人员预先定义好了几种界面呈现模式,且它们也可以一起搭配使用。这些模式包括。

导航栏接口模式的出现是为了应对界面间有上下页关系,上一页的标题会变成下一页的返回键(当然这点我们可以修改),如图6.1所示。例如,在设置界面上点选“通知”的话,界面会切换到通知的设置界面,同时在左上角也会出现一个“设置”的返回键。这个模式经常和表格控件一起使用,这是因为表格控件本身就具备了Master-Detail的特性。当然,这并不表示这两者必须一起使用,您仍然可以根据应用程序的情况来选择自己的界面呈现模式。

这个模式会在界面下方安排一列工具栏(UIToolbar),点选上面的按钮后,这些按钮会以高亮度来显示正在执行的功能。如图6.2所示,这里同时采用了导航栏模式与工具栏模式来呈现界面。

这个接口模式会在界面下方显示数个Tab,每个Tab都有其专用的界面(通常使用不同的界面控制器),用户可以很快地在这些界面中切换,就像切换频道一样方便,如图6.3所示。这个模式也常与导航栏接口模式一起使用。

模态接口模式会把要出现的界面由下方慢慢地拉到上方,并且遮盖住其他的界面;等到用户在界面上点选了某些按钮后,界面会被慢慢地拉到屏幕下方,如图6.4所示。

表格接口模式是最常见的一种数据呈现方式,用来表示Master-Detail的界面,也经常与其他模式合并使用,例如,联络人信息就是采用这种模式显示。我们会在后面以专门的一章来说明这个模式。

时间: 2024-08-02 09:15:37

《iOS创意程序设计家》——第6.1节 界面的管理的相关文章

《iOS创意程序设计家》——第6.4节事件检测

6.4 事件检测 iOS创意程序设计家 界面控制器除了负责界面的管理以及布局外,还负责事件的传递.这些事件包括我们在第5章已经介绍过的触控事件,还有接下来要介绍的晃动检测事件.这些事件都定义在UIResponder类里面,而无论是界面控制器UIViewController还是界面UIView,它们都继承自UIResponder类. 6.4.1 晃动检测 首先,我们来看看晃动事件的处理.与触控事件类似的是,晃动检测也是由一连串的事件所组成的,不过,要让您的应用程序支持晃动检测,必须让您的界面控制器

《iOS创意程序设计家》——第6.2节导航栏控制器UINavigationController

6.2 导航栏控制器UINavigationController iOS创意程序设计家 导航栏控制器(UINavigationController)位于界面的最上方,主要用于将具有因果关系的界面连接起来,它由几个元素组成:左边按钮.右边按钮以及标题.我们可以通过导航栏的navigationItem来访问这3个元素.其中,左右两边的按钮都是UIBarButtonItem类,我们可以通过navigationItem.rightBarButtonItem以及navigationItem.leftBar

《iOS创意程序设计家》——第6.5节Undo与Redo机制

6.5 Undo与Redo机制iOS创意程序设计家还记得第5章在提到UITextView的时候是怎样实现Undo机制的吗?其实,iPhone OS3.0以后就内建了Undo-Redo的机制.在默认的情况下,每一个应用程序的window对象都提供一个NSUndoManager对象,用以管理Undo与Redo的操作,而窗口内的每一个控件也都有其各自的NSUndoManager对象. 这个Undo-Redo机制是怎么运作的呢?首先,它会有两组堆栈(stack),分别用来存放Undo与Redo的操作,而

《iOS创意程序设计家》——第6.3节标签页控制器UITabBarController

6.3 标签页控制器UITabBarControlleriOS创意程序设计家相对于导航栏控制器,标签页控制器(UITabBarController)是将几个具有独立功能的界面使用Tab分隔开来,并定义在界面的下方.这些界面会存放在一个数组里面,而里面每个元素则是UIView-Controller的类,当然也可以包括导航栏UINavigationController在内.可以通过viewControllers属性或是setViewControllers: animated:方法来设置标签页控制器所

《iOS创意程序设计家》——导读

目 录第1章 从硬件的认识开始第2章 Objective-C语言的基础第3章 开发工具第4章 基本类与机制第5章 界面控件第6章 界面控制器 6.1 界面的管理 6.2 导航栏控制器UINavigationController 6.3 标签页控制器UITabBarController 6.4 事件检测 6.5 Undo与Redo机制 6.6 热身操第7章 操作信息的截取第8章 数据访问与打印第9章 表格控件与Core Data第10章 通讯录第11章 相机与相簿第12章 影音多媒体第13章 定位

【IOS开发必收藏】详解IOS应用程序内使用IAP/STOREKIT付费、沙盒(SANDBOX)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/550.html //--2012-12-11日更新   获取"产品付费数量等于0这个问题"的原因 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 "Contracts, Tax, and Banking "没

IDA反汇编/反编译静态分析iOS模拟器程序(八)IDA for Mac

iOS多用OC(Objective-C)编程,Mac也类似,所以IDA for Mac对OC的支持似乎强些.Windows的IDA在反汇编某些SDK库文件时会识别不出OC的函数名,而且对OC运行时的结构体也没识别出来.当然,因为我用的是6.1版的windows IDA, Mac上用的是6.4版,不知道是不是windows IDA 6.1的bug了. 总之在界面操作流程上,感觉Mac IDA是对OC有做优化的.当加载一个app时, 会询问是否解析和重命名OC的函数: 如果选择No,所有OC函数都会

IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译

反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品.既然是产品,那当然就另外收费,demo版是没有的.反编译的快捷键是F5,菜单位置在 顶部菜单View->Open Subviews->Pseudocode.(有网友问到为什么按照第一篇的地址下载IDA后也没有F5,最终是发现他自己装了python,设了环境变量,这会令IDA工作不正常) 在显示反汇编的窗口中按F5,经过分析后,会多了一个标签栏Pseudocode-A: 继续上一节(可用两个浏览

ios闹钟程序-iOS闹钟程序实现的过程

问题描述 iOS闹钟程序实现的过程 求iOS闹钟程序实现的过程,不要是早几年的,新版本的,感激不尽,非常感谢 解决方案 http://download.csdn.net/detail/u012524508/6431991