iOS Apprentice中文版-从0开始学iOS开发-第八课

添加‘信息’界面

我希望你还没有对这个app失去耐心,因为我们还有一些工作要做,我们要给它添加一个新的特色,一个“about(信息)”界面用于展示游戏简介或者开发者内容:

(about并不是信息的意思,但是所有计算机软件的about按钮被点击后都毫无例外的会弹出一段信息,所以我们就这样翻译它了)

新的一个界面

这个新的界面包含一个text view(文本窗口),用于显示游戏规则,并且包含一个close按钮用于关闭这个窗口。你可以通过点击游戏界面中的(i)按钮打开这个新的界面。

大多数app都包含多个界面,即使最简单的游戏,现在正是学习如果添加额外的界面的好机会。

我已经多次说过:你app内的每个界面(screen)都有自己专属的视图控制器(view controller)。如果你想到“screen”,那么请不要忘了“view controller”

Xcode会为你自动创建main ViewController对象,但是这个about screen的view controller必须由你自己创建。

在Xcode的File菜单中选择New->File,然后在弹出的窗口中选择Cocoa Touch Class模版(如果你看不到这个选项,确保弹出窗口顶部的选项中选择的是iOS)

选择Cocoa Touch Class模版

点击next,Xcode会让你填写一些选项:

新文件的选项

按照下面信息填写:

class:AboutViewController

Subclass:UIViewController

Also create XIB file复选框:不要选中

Language:Swift

点击next,Xcode会问你将文件保存在哪里。

保存新的文件

确保选择和这个app的project file一样的目录。

同时确保Group中显示的是BullEye,并且在Targets列表中的BullsEye前面有个复选框是选中状态。

点击Create,结束新文件的创建。

Xcode会将一个新的文件放到你的工程里,和你想的一样,新文件的名字叫做:AboutViewController.swift。

工程导航器中的新文件

打开Main.storyboard。这里并没有用于代表About view controller的screen。所以首先你要将这个screen添加上去。

从对象库(Object Library)中,选择View Controller并且将它拖拽到画布上,放在main view controller的右边。

从Object Library中拖出一个新的view controller

这个新的view controller完全是空白的。你得重新排列下storyboard里的布局,避免着两个view controller相互重叠。界面建造器(Interface Builder)在这方面不是很聪明。

拖一个Button到新的screen上,并且将它的标题修改为close。放在靠底部的某个位置(在拖拽的过程中,可以用蓝色辅助线帮助定位)

拖一个Text View到新的screen上,并拖拽它的边框使它覆盖界面上大多数面积,不要把Button也覆盖了。

你可以在Object Library中找到这些组件。如果你觉得挨个找很累,那么你可以在底部的过滤器中输入组件的名字搜索它们:

搜索名称包含text的组件

注意一下,这里有一个Text Field,也是一个文本框组件,但是它是单行的。你需要的是Text View,它可以容纳多行文本。

在把button和text view拖到视图中之后,它看起来应该是这个样子的:

About screen界面

双击text view就可以编辑它的文本了。text view会默认一段话作为展示用,全部删掉就好。

然后在其中填写下面的文本:

*** Bull's Eye ***
欢迎下载我们这个非常酷的游戏,在这里通过拖拽滑条你就可以得分。
你的目标就是将滑条拖动到尽可能接近目标值的位置。越接近得分越高。希望你能喜欢它。

小帖士:如果你在编辑text view的时候Xcode异常崩溃退出,那么就把text view删了,重新拖一个,这样多试几次。或者也可以直接在text view属性指示器的文本框中编辑。

在属性指示器的文本框里编辑内容

同时确保属性指示器(Attributes inspector)中的Editable(可编辑)复选框不要被选中,不选中就是只读,否则玩家可以修改该text view中的内容。

设置为只读

这个界面的设计就结束了。

那么当你点击(i)按钮的时候如何打开这个新的About screen view呢?storyboard中有一个简洁的技巧可以实现这个目的:segues(转场,这本来是拍电影时候的一个术语,从一个场景切换到下一个场景)。segue可以使一个界面跳转到另一个界面,并且非常易于添加。

点击(i)按钮选中它,然后按住ctrl键将它拖拽到about screen。

按住ctrl拖拽(i)按钮到另一个界面

放开鼠标后会弹出一个小窗口,上面有几个选项。选择Present Modally。

选择转场的类型

现在会出现一个箭头将两个视图链接了起来。这个箭头就代表转场(segue)。

点击这个箭头选中它。segue同样拥有属性。在属性指示器中选择Transition选框中的Filp Horizontal。这是UIKit提供的用于两个界面间转换的动画效果,你可以自己试试里面的所有选项。

segue的属性设置

现在你可以运行app,点击(i)按钮试试效果了。

一个切换屏幕界面的小动画

about screen随着一个小动画出现了。非常不错,它看起来很酷。

然而,一个非常明显的短板出现了,点击close按钮后什么都不会发生,你再也回不到之前的游戏界面上去了。这对玩家太不友好了,基本上就是秒删app的节奏。

segue是单程票。为了关闭about screen,你需要写一些代码为close按钮工作。作为一个iOS开发的新手,你已经知道了,这里需要一个action method(动作方法)。

这一次你是要在AboutViewController上添加action方法,而不是ViewController,因为close按钮是属于about screen的,不是之前的ViewController。

打开AboutViewController.swift,将class花括号内的所有东西删掉,替换为下面这个样子:

import UIKit

class AboutViewController: UIViewController {
    
    @IBAction func close() {
        dismiss(animated: true, completion: nil)
    }
}

close动作方法内的代码会通知UIKit关闭about screen,当然会自带一点小动画。

如果你将dismiss的第一个参数animated置为false,那么就不会有小动画了,游戏主界面会突然一下跳出来。这样玩家的感觉并不好,在一个界面跳转到另一个界面时,务必要带一些平滑的过渡,比如这种内建的小动画就很不错。

现在你就差临门一脚了,将close按钮的Touch Up Inside event和close动作方法连接起来。

打开storyboard,按住ctrl拖拽close按钮到about screen的View Controller。嗯?有点奇怪,当你放开鼠标后弹出的小窗口上应该有close action这个选项才对,但是没有,取而代之的是,出现了一个类似你添加转场时的菜单:

并没有出现你期待的close action

练习:试着自己找找哪里出了问题,当然不是Xcode的问题,是你自己的问题。

这个问题的原因是storyboard不知道这个界面(就是你新添加的)是用来给AboutViewController服务的。

首先你添加了一个AboutViewController的swift文件,然后你拖了一个新的view controller到storyboard里面,但是你没有告诉storyboard这两者是应该关联起来的,这个新的view controller应该属于AboutViewController(这也是为什么在大纲面板上它的名字仍然是ViewController而不是AboutViewController)。

幸运的是,这很容易被修正。打开storyboard,选择about screen的View Controller(黄色按钮的那个,不要选成游戏界面的那个了),然后选择身份检查器(属性检查器左边的那个),害怕选错的话,看下图。

可以直接点击这里选择,就不会选错了

在Custom Class选框中输入AboutViewController,输入完毕后敲一下回车。

在身份检查器(Identity inspector)中指定这个界面属于AboutViewController

其实你只需要输入开头的几个字母,Xcode应该会自动为你填好后面的部分。如果没有的话,检查一下你选中的是黄色图标的那个ViewController。

现在你可以正常的将close按钮和close action method连接起来了。

按住ctrl拖拽close按钮到AboutViewController(现在是叫做这个名字了,不要拖到ViewController上去),在弹出菜单的Sent Events下面应该有个close,选择这个。链接就完成了。

选择Sent Event下面的close

再次运行app,现在你可以在两个界面间灵活切换了。

恭喜你!这个游戏整个完成了。所有的功能,界面设计和代码都完成了,我可以告诉你,现在不存在任何bug了。

但是你必须承认,现在的游戏界面看起来糟透了。如果你像这样把它上架到app store里,我不确定会有人去下载它。幸运的是,把它弄漂亮点也是很容易的,所以,在下一小节,我们给它来个大整容吧。

你可以在06-About Screen里找到本节课的相关代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容