005 横竖屏模式以及对象、方法和数据的含义
如果你没开启锁屏,在 App 中倾斜机身,就会横屏过来,屏幕宽度变宽,高度变窄就是 「Landscape」,索性我就翻译成为横屏吧,正常你竖着看手机的时候就是「Portrait」,就叫成竖屏模式吧。
在此之前,你可能从来都没对 iPhone 的横竖屏产生过疑惑,很多 App 都是既可以横屏也可以竖屏情况下运行的,通常情况下,一般都是竖屏模式。
比如说很多人在写邮件的时候,都会把手机横过来,因为更大的键盘打字会更加的方便。在竖屏模式下,iPhone SE 水平方向有 320 个 Point,垂直有 568 个 Point。对于横屏模式来说,水平和垂直方向的像素点就翻转过来了。
所以说什么是 Point ? 在一些老的设备上,比如 3GS 、iPod touch 和初代 iPad 上一个 Point 对应的就是一个像素点。所以最后导致的就是在低分辨率的屏幕上(那些图像看起来并不锐利的设备),因为每个像素都很大并且图标很大。我确定你很清楚像素。以防万一,像素就是组成屏幕的小元素。iPhone 是的屏幕像是一个巨大的母体,里面有很多有独立颜色的像素,就像电视的屏幕一样。改变像素点颜色的数值就可以改变图像的颜色。越多的像素,就可以看到越多的图像。
在采用高分辨率 Retina 屏幕的 iPhone4 及更新的设备,一
个 Point 在垂直和水平的方向上对应的都是两个像素点,所以其实在平面中一个 Point 对应了四个像素的位置。它在非常小的空间内包含了大量的像素,可以显示出更清晰的图像,从 iPhone4 开始也标志着 Retina 屏幕的普及。
在 Plus 机型上显现的更加夸张,它有三倍的分辨率,那么一个 Point 实际上时占用了 9 个像素点。你几乎无法分辨独立的像素点的存在。
以 Point 计算的屏幕
在以前只有一种尺寸的 iPhone , 但是到今天算上刚刚发布的 iPhoneX 已经有五种尺寸的 iPhone 了,这还没有算上 iPad 版本。即便是有多种尺寸的 iPhone,我们也要处理这问题。
记住 UIKit 是基于 Point 工作的,而不是基于像素点工作的,所以你只需要关注不同的屏幕尺寸对应的 Point 就可以了。像素点只是对图像设计重要,因为图像还是在按照像素点计算的。
Developer works in points, designer works in pixels.
可能你还是有些疑惑,但是不用担心,我们设计不到太多的这些知识,我们在本程序中只涉及到 iPhoneSE 的 320 * 586 Point 的版本。在这之后我们会去适配不同屏幕尺寸的iPhone。
切换 App 到横屏模式「Landscape」。
想要从竖屏「Portrait」到横屏「Landscape」模式,你需要做两件事。
1.在 Main.storyboard 中将 Portrait 换到 Landscape。
2.修改 App 的Supported Device Orientations 设置。
- 在 Interface Builder 中打开 Main.storyboard 在 View as:iPhone SE 面板中将 Orientation 修改为 Landscape。
因为它更改了屏幕的长宽尺寸,所以你会发现按钮的位置发生了变动。
-
重新将按钮移动到屏幕中央,这样就修改了横屏模式下的 UI控件位置。
-
用 iPhone SE 的模拟器运行你的 App,你刚开启模拟器还不会显式 Landscape 模式,一切看上去还是跟以前一样。当你旋转屏屏幕的时候,一切看上去就正常了。
-
在 Xcode 的菜单栏选择 Hardware → Rotate Left 或者 Rotate Right,或者按 Command + 向左键或者向右键来旋转模拟器方向。
需要注意的是,在 Landscape 模式下是不会再显式状态栏的。这会让用户界面显式更多的内容。
在这里你需要做一个配置,告诉 iOS 你的 App 都支持那个方向的旋转。
-
在 Project navigator 的顶部点击 Bull's Eye 项目图标,然后会出现一些列的关于 App 的设置页面。
-
选择 General ,然后在 Deployment Info 一栏选择 Device Orientation。
- 勾选 Landscape Right 和 Landscape Left ,如果 Portrait 和 Upside Down 被勾选,请取消掉这两者的勾选。
重新运行 App ,这时你会发现启动 App 的时候默认就是 Landscape 模式了。
对象、数据和方法
是时候该上一些理论课了,别逃跑哦。
Swift 被称作为面向对象的编程语言,这也就意味着你所作的大多数东西都会涉及到对象。在前面也提到过几次,应用程序由彼此发送消息的对象组成。
当你编写 iOS 程序时,你将用到一些系统提供给你的对象。像 UIKit 里的 UIButton 对象一样,你也会自己创造一些对象,比如 view controllers。
所以什么才是一个对象?将对象视为程序的构建模块。程序员喜欢将相关功能分组到对象中。比如有的对象专门负责解析文件,有的专门负责在屏幕上绘制图像,还有的负责复杂的运算等等。
每个对象都处理程序中的一个部分,所以在一个 App 中会有很多个不同的对象,几十个甚至上百个都可能。
即便是刚刚开始的一个小的 App 都包含着几个不同的对象。到目前为止,你花时间最多的对象就是 ViewController,「Hit Me!」这个按钮也是一个对象,以及弹出的提示框也是,写着「Hello World 」的文本也是对象。
在这个 App 里同样有个叫做 AppDelegate 的对象,你甚至在这个课程里会经常忽视它的存在(如果你好奇的查看源码),实际上它无所不在。
一个对象可能会同时具有数据和方法:
- 比如说之前你添加到 view controller 的「Hit Me」 按钮。当你把这个按钮拖拽到 storyboard 的时候,它其实已经成为 view controller 的数据了,数据会承载某些东西。在这个实例里,view controller 就包含了按钮。
- 关于方法的例子就是 showAlert 这个方法,就是用来响应点击事件并弹出提示框的那个方法。话说回来,方法就是来做某些事的。
按钮本身就既是包含数据又事实现功能的方法。按钮的数据就是文本,和 Label 的颜色啊,它在屏幕上的位置,宽和高等等。按钮同样有实现功能的方法:它能识别用户的点击操作,然后触发一个操作来响应用户。
提供某些功能的方法一般称为方法。在其他编程语言里可能会被称为「程序」或者「子程序」或者「函数」。你同样可以在后面的 Swift 中看到函数的例子;方法是简单的函数同属于对象。
showAlert 的行为就是一个方法的典型例子。你可以告诉它这是一种方法,因为在该行写着 func(对 function 的缩写),后面跟着一个对圆括号。
你仔细观察ViewController.swift 剩下的代码,会发现有好几个这样的方法,比如 viewDidLoad 和 didReceiveMemoryWaring 方法。
为了方便你使用,Xcode 会有一些方法的模板,这些方法也通常在 view controllers 里,从某个角度来说,当你需要的时候,只要在方法体里填充上就可以了。
或许关于方法的概念还是有点困惑,这里有个例子可以帮助你理解。
我们来想象一个这幅图中应用到的方法场景,你想举办一个 Party ,但是忘了买冰淇淋。幸运的是,你邀请了一个名叫 Steve 的朋友,他就住在附近并且离便利店很近,没有冰淇淋的 Party 怎么行?所以在 Party 上的某个时刻,你发送消息给 Steve ,告诉他买一些冰淇淋回来。
这时候计算机就会跳转到 Steve 这个对象并执行 buyIceCream() 这个方法。然后一条一条地执行,直到这个方法完成,然后计算机会返回到你的 throwParty() 方法,然后继续执行剩下的代码,所以你和你的朋友就都可以吃到冰淇淋了。
Steve 对象同样有数据可言,在去商店之前他要有钱,到了商店他要换一些硬币(数据的转换)。当然还有一条重要的数据就是冰淇淋啦。当这些数据处理完毕,他会带着冰淇淋(数据)返回到 Party 中啦。
上文提到的「发送消息」其实就是在调用 Steve 的 buyIceCream() 方法啦。这算是一个很好理解对象间通信的方法啦。计算机可以简单地从 throwParty() 跳转到 buyIceCream() 方法,然后再返回。
通常术语来讲就是「调用方法」(calling a method & invoking a method)。这也意味着跟「发送消息」的含义一样。计算机会跳转到你调用的方法,执行完调用的方法后回到刚才调用方法的位置后继续执行代码。
很重要的一点要记住:对象是有方法 (调用买冰淇淋的方法) 和数据 (就是买的冰淇淋啊) 的。
对象在某种程度上是可以看对方的数据的,但也不尽然(比如 Steve 可能不会让你偷看他的钱包),对象也可以其他对象执行他们的方法,这就是你的 App 做的事。
那这个小节就讲到这了,赶快回顾一下这一节都讲了什么问题吧。
下一节我将带着你把所有剩下的控件都添加到 storyboard 上,并告知你每个控件的用法以及关于事件的绑定,还有一个重要的数据结构「String」(字符串)。