已经学会了怎么做一个只有一个页面的应用。
现在准备继续学习下一步的工作了。
应用的工作原理
一个应用如何工作?
一个应用是由对象组成的,而这些对象之间可以相互发送消息。
iOS中,应用是事件驱动的。
对象会等待某些特定的事件发生,然后进行处理。
iOS的应用大多数时间都在……无所事事?
直到我们触碰屏幕的时候,应用会花上几个微妙的时间来处理这个事情,然后接着无所事事,直到下一个事件的到来。
作为一个程序员,扮演的角色就是编写一些代码,当你的对象接收到事件发生的消息后对它们进行处理。
回到现在做的这个应用上,按钮这个对象做了什么呢?
- 按钮的Touch Up Inside(点击)事件和视图控制器的showAlert是关联在一起的。
- 在showAlert中,视图控制器向UIAlertController对象发送另一条消息addAction。
- 为了显示弹出警告提示框,试图控制将发送消息presentViewController。
整个应用都是由使用类似方式来相互交流的对象组成的。
这种事件驱动模型和PHP脚本的工作方式是不一样的。
PHP代码会从头到尾顺次执行,直到抵达代码尾部,然后退出。
应用则不同,除非我们强制关闭(或者自己崩溃了),否则是不会主动退出的。它们会等待输入事件的发生,然后立即处理这些事件,完成后继续等待下一个事件。
不管哪种类型的事件,应用所做的每一件事都是由某种事件来驱动的。
UIKit和其他框架(frameworks)
iOS中提供了很多建筑程序“大厦”用的基础材料,我们将其称之为frameworks(框架),或者说“kits(组件)”。
UIKit这个框架是最基本也是最重要的一种,其中提供了用户界面的一些控件,比如按钮,标签,导航栏等。使用它可以管理视图控制器,同时处理一切和应用的用户界面相关的事情。(UI的全称就是User Interface)
在应用中,所有以UI为前缀的对象都来自于UIKit。
开发一款iOS应用的时候,可以说da部分间都在和UIKit这个框架打交道。其它的框架也各自有各自的用途。比如Foundation框架提供了构建APP的很多基本要素。Core Graphics框架用于在界面上绘制基本形状, 如直线,矩阵,渐变和图形等。AVFoundation框架用于播放声音。当然还有其它更多的框架。
iOS的完整框架又被称之为Cocoa Touch。
切换设备显示模式
横屏和竖屏的概念很简单。
point和pixel在iOS上的对应关系
但是需要注意的是point(点)这个概念。
对于iOS来说,point(点)不等于pixel(像素)。
pixel(像素),是任何一个屏幕的最小显示单位。
对于老的设备而言,一个point对应的就是一个pixel。
对于Retina(视网膜屏)来说,一个point对应的是垂直和水平方向上的各2个pixel。
对于iPhone3GS来说,320 * 480 point对应的就是320 * 480 pixel。
对于iPhone4S来说,320 * 480 point对应的就是640 * 960 pixel。
iOS机型的屏幕尺寸和相应的分辨率(以Point为单位)
设备类型 | 屏幕尺寸 | 屏幕分辨率(Point) |
---|---|---|
iPhone4S及以前的机型 | 3.5 | 320*480 |
iPhone 5,5c,5S,SE | 4 | 320*568 |
iPhone 6,6s,7,8 | 4.7 | 375*667 |
iPhone 6,6s,7,8 PLus | 5.5 | 414*736 |
iPhone X | 5.8 | 375*812 |
iPad | 7.9,9.7 | 768*1024 |
iPad Pro | 12.9 | 1024*1366 |
需要牢记的是,UIKit使用的单位是point(点),而不是pixel(像素)。
开发者以point为单位,设计师以pixel为单位。
让应用在横屏模式下工作
为了将应用从竖屏模式切换为横屏模式,需要完成三件事情。
- 让Main.storyboard中的视图使用横屏显示
- 更改设备的“Supported Device Orientations”设置
在Xcode的Interface Builder中打开Main.storyboard,在View as:iPhone SE面板中,将Orientations改成landscape。
将按钮移回视图中间位置。
- 从iOS Simulator的菜单栏上选择Hardware-Rotate Left或是Rotate Right,也可以按住command键,然后按左右箭头切换模拟器朝向。
横屏模式下,界面不会显示iPhone的状态栏,这样可以让应用充分的利用空间。
这是手动调节,实际上有一个配置选项让iOS知道应用的显示方向。一般情况下,从模板新建的应用同时支持ortrait和Landscape布局。
在Xcode中点击Project Navigator(项目导航)顶部的项目图标,在右侧的General选项卡中的Deployment Info下面有一个Device Orientations。取消Portrait选项就OK了。
关于对象和方法
Swift属于所谓的”面对对象”的编程语言,也就是说你要做的大多数事情都和某种类型的对象有关。一个应用就是由彼此可以发送消息的对象组成的。
开发一款iOS应用的时候,通常会用到系统提供给你的一些对象。 比如UIKit框架里面的UIButton对象。同时也会制造属于自己的对象,比如视图控制器。
对象(object)究竟是个什么东西?
如果把要开发的产品比作一栋大楼,那么对象就是修建这栋大楼的砖块。
程序猿们喜欢把有一定关联的功能放到对象里面去,这个对象可以解析某个RSS feed,那个对象可以在屏幕上绘制一个图像,还有个对象可以执行杂的计算。每个对象都负责程序中的某个特定部分。
在一个完整的应 中存在着多种 同的对象。
对于这个应用来说,也包含了几个不同的对象。
最常用的就是Viewcontroller这个视图控制器。
按钮也是一个对象,提示对话框也是。
在iOS应用里面,对象无处不在。
一个对象既有数据(data),也有功能(functionality)。
- 当我们把按钮拖曳到storyboard里面的时候,它就成了视图控制器的一种数据(data)。数据总是包含着一些东西。在这里,视图控制器就包含了按钮。
- 功能,就是执行一些具体的操作。为这个按钮添加的showAlert动作,就是一个功能。
按钮本身也有自己的数据和功能。
按钮上的标签文本内容和颜色,在屏幕上的位置,自身的高度和宽度等等,都是它的数据。
按钮的功能则是:它能发现玩家触碰到它,然后触发一个动作作为响应。
方法
在iOS开发中,一个对象的功能通常被称为method(方法)。
其它的编程语言可能会换个叫法,比如“函数”,“过程”,“ 子程序”之类……
但是在Swift里面的术语是方法。
方法就是属于某个对象的功能。
showAlert动作就是一个方法。
在Swift中识别方法很简单,代码前面使用func(function的缩写)方法的名字后面是括号()。
@IBAction func showAlert(){}
方法的概念
用个例子来说明一下
我(这个对象)在家里准备今晚的晚饭,但是忘记买青菜。
没有青菜就不能做晚饭,所以我给老婆(另一个对象)发送消息让她买点青菜。
这时候系统会切换到叫老婆(另一个对象),然后执行她的方法(买青菜),从头到尾依次执行。一旦她的方法完成,系统就会回到我(这个对象)的方法,继续其他的事情。
老婆(另一个对象)也有自己的数据。买青菜前,她知道自己有钱(数据)。在商店里和售货员交换了钱的数据,结果是用钱的数据的减少换来了青菜的数据的增加。做完这件事之后,她带着青菜回家。
“发送消息”实际上比字面上的意思更复杂。
我们可以用它来帮忙理解对象之间是如何交流的,系统只是简单地从准备晚餐(方法)跳转到买青菜(方法)然后再跳转回来。
通常来说,“调用方法”和“触发方法”都是一回事,系统会跳转到你要调用的方法,然后在执行完毕其中的代码后,返回到之前的方法。
一个很重要的事情是,对象都有自己的方法和数据。对象可以查看其他对象的的数据,以及让其他对象执行他们的方法。这些事情放在一起,就组成了一个完整的应用。