app是怎样工作的
现在是时候来建立一些概念关于这些app场景的后台是如何工作的。
任何一个app本质上讲都是由可以互相传递消息的对象组成的。在你的app中许多的对象都是由iOS系统提供的,例如按钮——就是一个UIButon的对象,提醒窗口——就是一个UIAlertController对象。而有些对象需要你自己编程,比如视图控制器(view controller)。
这些对象通过互相传递消息来通讯。比如当用户点击app 中的Hit Me按钮,UIButton对象就会发送一条消息到你的视图控制器。转而这个视图控制器也许会向更多对象传递消息。
在iOS系统中的app属于事件驱动型app,这意味着各种对象都等待某一发生的事件然后处理它们。
一个app在大多数时间所做的事情就是——什么都不做,这听起来很奇怪。它只是坐在那里等待着某些事情的发生。假如用户点击屏幕,它会跳起来活跃几毫秒,然后继续归于沉睡,直到下一个事件到来。
你在这个计划中的角色就是写一些当你的对象收到消息时将要执行的源代码。
在这个app中,按钮(button)的触摸事件(Touch Up Inside)被链接到视图控制器(view controller)的UIAlertController对象上。在接受到视图控制器的关于展示窗口的消息后,展示出提醒窗口。
你的整个app都会由这种互相通讯的对象组成。
也许你曾经使用过PHP或者Ruby脚本来做网站。这种基于事件的模型和PHP脚本工作原理是不同的。PHP脚本从头到脚的方式运行,按照顺序一条条的执行语句,直到最后一条执行完毕后退出。
而app从某方面讲,从不会退出直到用户中断它们(用户主动退出app)或者发生程序崩溃。它们花费大量的时间等待事件输入,然后处理这些事件,然后继续沉睡。
来自用户的输入,大多都是触摸和点击,这是app的事件的重要来源但是也有一些其他类型的事件。例如,当有电话接入时,操作系统会通知你的app这一事件,并且重新生成一个界面(接电话的那个界面),或者当一个计数器数到了指定数值,或者其他情况。。。
你的app做的所有事情,都是由某些事件引发的。
按照我们的工作列表继续往下做(我们之前有一个工作列表,记得吗_)
现在我们完成了我们的第一个任务,放一个按钮在界面上,并且使它弹出一个提醒窗口,你将要过一下这个列表,并且列出其余的事项。
你无需按照特定顺序去做这些事,虽然有些事情必须在其他事情前面去做。比如,当我们还没拥有一个滑条的时候,我们就无法读取滑条上的值。
所以,让我们来添加剩下的控件——滑条、文本标签,把这个app变的有模有样点。
当你做完以后,这个app看起来会像是这个样子:
哈,等一下,这看起来好像跟我承诺给你们那个漂亮的游戏界面有些不一样!造成这一区别的是,这些标准UIKit控件的素颜看起来就是这个样子。
你可能以前见过这样的东西,因为常规应用程序都差不多。但是由于这个外观使游戏看起来过于单调,我们会在本节课的最后把它打扮一下。
UIKit and other frameworks(UIKit和其他框架)
iOS以框架或kits的形式提供了许多功能模块。其中UIKit框架提供用户接口控件,比如buttons(按钮),labels(标签)和navigation bars(导航栏)。它管理着视图控制器,并且通常也管理任何其他的存在于你app上的用户接口。(这里的UI就是User Interface的缩写)
如果所有的东西都要你从头开始写,那么这个工作量是无法接受的。取而代之的是,你可以将你的app建立在系统提供的框架之上,利用哪些苹果公司的工程师早就为你做好的事情。
任何你见到的以UI开头的对象,例如UIButton,都是来自UIKit的。当你写一个苹果app时,UIKit是一个和你打交道最多的框架,当然还有一些其他框架你会有很多接触。
其他的一些框架例如Foundation,提供许多基础功能模块用于构建app;Core Graphics用于在屏幕上进行绘图,渐变和图像功能;AVFoundation用于播放音频和视频;还有其他很多框架。。。
iOS的完整框架体系被统称为:Cocoa Touch。
Portrait vs. landscape(竖屏与横屏)
注:iOS术语中竖屏模式称为:Portrait(肖像画)因为肖像画总是竖着的,横屏模式称为landscape(风景画)因为风景画多半是横着的。
注意一下,app的尺寸规模是会发生变化的:iPhone横着放的时候,屏幕会很宽,但是高度会比较低。这叫做横向(landscape orientation)。
毫无疑问,你肯定在iPhone上见过横向的app。游戏app就经常是横向的。还有其他的很多类型app除了竖屏模式以外,也同时具备横屏模式。
就拿发邮件来说,许多人在准备写邮件时,都会先把手机横过来,因为横屏比较宽,可以容纳大尺寸的键盘,比较容易打字。
在竖屏模式下,iPhone SE在水平方向上有320个点,垂直方向上有568个点。在横屏模式下则正好相反。
什么是点(point)?
在早期的设备里——追溯到iPhone 3GS与同时期的iPod及iPad,一个点就是一个像素。因此,这些低分辨率设备看起来并不清晰,因为这些笨重的像素。
我确信你知道啥是像素。为了防止你不知道,简单解释一下,像素就是你屏幕上的最小组成部分。你的iPhone上显示的就是一个具备各自颜色的像素组成的一个大的矩形,就和电视屏幕一样。像素越多,图像就越清晰。
iPhone4及以后的型号都使用的是一种高分辨率的视网膜屏,其中一个点对应水平方向上的两个像素及垂直方向上的两个像素,一共是4个像素。视网膜屏设备都普及采用这种方法,把许多像素塞进非常小的空间,得到非常清晰的显示效果。
Plus系列则更加疯狂:给一个点分配九个像素,以到达三倍的分辨率。天啊!在这种梦幻的HD视网膜屏上,你需要有鹰的眼睛才能分辨出独立的像素。它们小到了几乎无法分清一个像素和一个像素之间的距离。(我确信作者就是这个意思,说实话,这一课的废话有点多,不过为了保持原汁原味,我未做任何删减)
多种类型的iPhone之间的区别并非仅仅是像素的数量。经过这么多年,它们的外形也变化很大,从最开始的3.5英寸到现在Plus系列的5.5英寸。
形状尺寸决定了横竖两个方向能够具备多少个点:
早期的iOS系统只针对一种屏幕尺寸,但是这种一个尺寸打天下日子已经远去了。现在,我们有多种屏幕尺寸需要处理。
记住UIKit是以点(points)而不是像素(pixels)工作的,所以你只需要操心各种屏幕之间的点有什么区别。实际的像素数量仅对美工设计有意义,因为图像仍然是以像素计算的。
开发者用点(points)做单位,美工设计用像素(pixels)做单位。
点和像素的区别也许让你有点小困惑,不过如果这是你到目前为止的唯一困惑的话,那么说明我教的还不错。
在本节课的初始,你仅仅针对屏幕尺寸为320*568的iPhone SE上工作——这样简单一些。稍后我们让这个游戏适应于所有iPhone类型。
将app转换到横屏
为了将app从竖屏转换到横屏,你需要做以下两件事情:
1、使Main.storyboard中的视图(view)用横屏替代竖屏。
2、改变app设备方位支持(Supported Device Orientations)中的设置。
打开Main.storyboard。找到View as:iPhone SE面板,将方向改变为横屏:
这一操作改变了视图控制器的尺寸规模,同时也将按钮错位了。
将按钮重新拖回到屏幕中间,因为眼下这个时代,不允许丑陋的用户界面(看来中外都是一个看脸的时代啊T T)。
视图布局看起来好些了。
在iPhone SE的模拟器中运行app。这时屏幕还没有处于横屏模式,并且按钮也不在屏幕中心位置。
然而,如果你旋转模拟器到横屏位置到横屏模式,那么一切就又恢复正常了。
在模拟器菜单中选择Hardware → Rotate Left 或 Rotate Right就可以改变屏幕的方向,或者用command+方向箭头也可以改变屏幕的方向。
注意一下,在横屏模式下app的界面中没有显示iPhone的状态栏。这给了app用户界面更多的空间。
你还需要做一件事情。这里有一个配置选项告诉iOS你的app支持那种方位。新建的app都同时支持横屏和竖屏。
点击位于工程导航(Project navigator)中的BullsEye工程的图标。你会在Xcode的窗口中看到一个有许多设置的面板出现。
确保选中General标签页
在Deployment Info节点中,有一个Device Orientation(设备方位)选项。
取消选中Portrait选项的复选框,仅保留Landscape LeftLandscape Right选项的复选框。
重新运行app,这时app一开始就在横屏状态下运行了。