【精通iOS开发(第7版)】读书笔记03(P115~135)

写在前面

  这几天一直在整UI的东西,不得不说看多了确实有点头疼,特别是一些方法完全不了解(是不是应该先看一遍API比较好- -)。至今学到了自适应和多视图(今天学到)的内容,看了看接下来几章全是介绍各种UI控件的,头大。所以打算把目前学到的UI知识巩固一下,然后开始学习Sprite Kit框架,一来是换换脑子,二来是因为这么多控件的方法一时之间也不可能记得住,等接触Sprite的时候再去查找和使用好了。毕竟游戏比较有趣,以前也做过相关内容,现阶段只是想快速上手OC,所以就这么决定了。

  另外有空把博客园编辑器改一下,尤其是排版和代码高亮,有空再说...有空再说...

=====================================================================================================================多视图在APP中经常会用到,就是在一个应用中切换界面,这么说可能有点抽象,比如iOS的设置菜单,就是一个多视图应用,这里主要举例说明了切换视图的方法。具体如下:

当点击左下的Switch Views按钮时切换黄色视图,并且蓝色视图和黄色视图可以来回切换

    

如何实现

  首先需要左下角的Toolbar控件

然后设置该控件距离左下右的为0,即紧贴边框,确定添加约束

接下来创建两个新的视图类,blueView和yellowView,选择Cocoa Touch文件类型,父类选择UIViewController。

准备工作都做好了,现在开始添加逻辑部分了。打开ViewController.h,导入刚刚新建的类并且创建这两个对象的属性,为了在后面的过程中对这两个视图进行切换设置

然后我们在这里创建一个方法,用来切换视图,接着在storyboard中拖出一根线指向该方法建立关联,方法的具体内容将在稍微完成

再次回到storyboard,拖入两个View Controller用来表示黄视图和蓝视图

在这里为了方便辨别,我们可以在属性窗口中给这两个视图设置类和颜色,并且给它们加上自己的storyboard ID,为了方便我们后面调用

回到ViewController.m,我们已经拥有三个视图和一个切换的按钮

现在需要什么

  首先我们需要设置一个启动后可以看见的视图,这里就默认让蓝视图启动好了,实现一下viewDidLoad方法即可

这里主要做了三件事。还记得刚刚设置的storyboard ID吗?第一句是通过stor ID获取到视图控制器;第二句是将该视图控制器与父视图设置成一样的大小;第三句是一个方法,功能是实现从一个视图到另一个视图的切换,在这里先声明一下,稍后会实现。

书中在这里提到了一个叫做延迟加载(lazy loading)的技术,大概可以理解为需要什么的时候再加载什么。比如在这里,如果我们在应用启动时就加载了蓝色视图和黄色视图,而用户可能根本不会点击切换到另一个视图就关掉了APP,这样加载的资源就浪费了。

所以这里解释了为什么要在启动方法里设置可见的视图

回到switchViews方法,我们要实现切换视图的方法

这段代码不太好理解,看了很多次才弄了个半懂- -

首先检查黄视图的父视图是否存在,因为如果该视图显示,那么该视图肯定在主视图之下,如果没有父视图,就意味着该视图没有显示,显示的是另一个视图,从而得知当前显示的视图是哪一个。假设当前显示的是黄视图,那么其父视图不存在并且控制器也不存在,这时就会根据storyboard ID初始化一个黄视图控制器,对于蓝视图来说也是如此。接下来是第二个条件语句,首先设置了自身显示的大小,然后删除了当前视图,切换成自身的视图。其实一直在想下面条件语句里的内容为何不写在上面,看到后面发现在这里有添加过渡动画的代码,所以可能是为了动画作者故意这样写的。

接下来书中说到了在按下切换视图按钮前不会为黄视图浪费资源外,延迟加载还能够释放当前未显示视图所占的内存。当内存减少到系统设定的一个水平时,iOS将调用UIViewController里的didReceiveMemory-Warning方法。所以既然知道下次显示的视图是什么,那么我们就可以释放不显示那个视图所对应的控制器,这个功能通过实现didReceiveWarning方法来完成。

最后别忘了在前面反复使用的一个方法switchFromViewController:toViewController。这个方法的功能是从旧视图切换到新视图

这段功能氛围两个部分完成,一个是抹去当前视图,一个是加载需要显示的视图,先看后面那个:首先把toVC作为主视图的子控制器,随着将其以索引为零的状态插入到子视图列表中,索引为0的目的让该视图处在所有东西之下,这样就不会对上层的控件进行遮挡,最后通知父视图该子视图已经添加到了控制器之下。

添加的方法已经知道了,所以移除的方法就是该方法的逆过程:首先通知父视图要移除该视图,然后从子视图列表中删除,最后删除该视图。

到此功能已经实现了,可以打开模拟器进行测试。书在这里还添加了一个切换的过渡动画以增强效果,动画还没有接触,贴上代码和效果图,以后看-。-

posted @ 2015-12-16 21:30  Shvier  阅读(286)  评论(0)    收藏  举报