当前位置:首页> 滚动 >

SwiftUI学习100天(Day 21 - 项目 2,第二部分)

时间:2023-01-24 11:19:49    来源:哔哩哔哩

原创链接:https://www.hackingwithswift.com/100/swiftui

以下内容仅供学习参考: 


(资料图)

人们在学习编程时经常抱怨的一件事是,他们真的想忙于制作他们拥有的大应用程序创意,但他们需要按照教程制作完全不同的应用程序。

我知道这可能很烦人,但请相信我:你所学的一切都不会浪费。当然,你可能永远不会制作猜旗游戏,但你在这里学到的概念——构建布局、跟踪状态、随机化数组等等——将让你受益多年。

奥普拉·温弗瑞 (Oprah Winfrey) 曾经说过,“做你必须做的事,直到你能做你想做的事为止。” 在这 100 天的课程结束时,我希望你能够做你想做的事,但与此同时坚持下去——你正在学习这里的关键技能!

今天你完成三个主题,你将在这些主题中应用你在VStackLinearGradient、警报弹窗等方面的知识。

堆叠按钮

我们将通过构建基本的 UI 结构来启动我们的应用程序,这将是两个告诉用户该做什么的标签,然后是三个显示三个世界旗帜的图像按钮。

首先,找到这个项目的资产并将它们拖到你的资产目录中。这意味着在 Xcode 中打开 Assets.xcassets,然后从 project2-files 文件夹中拖入标志图像。你会注意到这些图像以其所在国家/地区以及@2x 或@3x 命名——这些图像具有双倍分辨率和三倍分辨率,可处理不同类型的 iPhone 屏幕。

接下来,我们需要两个属性来存储我们的游戏数据:一个包含我们要在游戏中显示的所有国家/地区图像的数组,以及一个存储哪个国家/地区图像正确的整数。

Int.random(in:)方法会自动选择一个随机数,这在这里非常完美——我们将使用它来决定应该点击哪个国家的国旗。

在我们体内,我们需要在垂直堆栈中布置我们的游戏提示,所以让我们从这里开始:

在下方,我们希望拥有可点击的标志按钮,虽然我们可以将它们添加到相同的位置VStack,但实际上我们可以创建第二个 VStack按钮,以便我们更好地控制间距。

我们刚刚在上面创建的VStack包含两个文本视图并且没有间距,但是标志之间将有 30 点间距,因此看起来更好。

因此,首先将此ForEach循环直接添加到我们刚刚创建VStack末尾下方:

修改器renderingMode(.original)告诉 SwiftUI 渲染原始图像像素,而不是尝试将它们重新着色为按钮。

现在我们遇到了一个问题:我们的body正试图发回两个视图,一个VStack和 一个 ForEach,但这将无法正常工作。这就是我们的第二个VStack用武之地:我希望你用一个新的 VStack包裹原来VStack的和下面的ForEach,这次间距为 30 点。

所以你的代码应该是这样的:

拥有两个像这样的垂直堆栈可以让我们更精确地定位事物:外部堆栈将每个视图间隔 30 点,而内部堆栈则没有间距。

这足以让你对我们的用户界面有一个基本的了解,而且你已经发现它看起来不太好——一些旗帜中有白色,与背景融为一体,并且所有旗帜都在屏幕上垂直居中。

稍后我们会回来完善 UI,但现在让我们使用蓝色背景色以使标志更容易看到。因为这意味着在我们的外部VStack后面放一些东西,所以我们也需要使用一个ZStack。是的,我们会在一个ZStack中有一个VStack,在另一个VStack,这是完全正常的。

首先在外部VStack周围放置一个ZStack,如下所示:

现在把它放在 ZStack里面,所以它在VStack外面

.ignoresSafeArea()修饰符可确保颜色正好到达屏幕边缘。

现在我们有一个较暗的背景颜色,我们应该给文本一些更亮的颜色,以便它更好地突出:

这个设计不会点亮世界,但它是一个坚实的开始!

通过警报显示玩家的分数

为了让这个游戏有趣,我们需要随机化旗帜的显示顺序,每当他们点击旗帜时触发警报告诉他们是对还是错,然后重新洗牌。

我们已经设置correctAnswer为一个随机整数,但标志总是以相同的顺序开始。为了解决这个问题,我们需要countries在游戏开始时对数组进行洗牌,因此将属性修改为:

如你所见,该shuffled()方法会自动为我们随机化数组顺序。

现在更有趣的部分是:当标记被点击时,我们应该做什么?我们需要用一些代码来替换注释// flag was tapped,这些代码可以确定他们是否点击了正确的标志,而最好的方法是使用一个接受按钮整数并检查它是否与我们的correctAnswer属性匹配的新方法。

不管他们是否正确,我们都想向用户显示一个警告,说明发生了什么,以便他们可以跟踪他们的进度。因此,添加此属性以存储警报是否显示:

并添加此属性以存储将在警报中显示的标题:

因此,无论我们编写什么方法,都将接受被点击的按钮的编号,将其与正确答案进行比较,然后设置这两个新属性,以便我们可以显示有意义的警报。

直接在body属性后添加:

我们现在可以通过用// flag was tapped这个替换注释来调用它:

我们已经有了number,因为它是由 ForEach提供给我们的,所以只需将其传递给 flagTapped()即可

在我们显示警报之前,我们需要考虑当警报被解除时会发生什么。显然比赛不应该结束,否则整个事情马上就结束了。

相反,我们将编写一种askQuestion()方法,通过洗牌国家并选择一个新的正确答案来重置游戏:

该代码不会编译,希望你很快就会明白原因:我们正在尝试更改未使用@State标记的视图属性,这是不允许的。所以,去声明countriescorrectAnswer的地方,把@State private放在它们面前,就像这样:

现在我们准备显示弹窗。这需要:

使用alert()修饰符,以便在showingScore为真时显示警报。

显示我们设置的标题scoreTitle

有一个在点击时调用的关闭按钮askQuestion()

所以,把它放在ZStack的body属性的末尾

是的,三个问号应该包含一个分数值——你很快就会完成该部分!

设计我们的旗帜

我们的游戏现在可以运行了,尽管它看起来不太好。幸运的是,我们可以对我们的设计做一些小的调整,让整个事情看起来更好。

首先,让我们用从蓝色到黑色的线性渐变替换纯蓝色背景色,这样可以确保即使旗帜具有类似的蓝色条纹,它仍然会在背景中脱颖而出。

所以,找到这一行:

并将其替换为:

它仍然忽略安全区域,确保背景从边到边。

现在让我们稍微调整一下我们使用的字体,让国家名称——他们需要猜测的部分——成为屏幕上最显眼的文本,而“Tap the flag of”文本更小更粗.

我们可以使用修饰符控制文本的大小和样式font(),这使我们可以从 iOS 上的一种内置字体大小中进行选择。至于调整字体的粗细weight()——无论我们想要超文本、稍微加粗的文本等——我们可以通过向我们要求的任何字体添加修饰符来对其进行细粒度控制。

让我们在这里同时使用这两个,这样你就可以看到它们的实际效果。在“Tap the flag of”文本之后直接添加:

并将此修饰符直接放在Text(countries[correctAnswer])视图之后:

“大标题”是 iOS 为我们提供的最大内置字体大小,它会根据用户对其字体的设置自动放大或缩小——这一功能被称为动态字体。我们正在覆盖字体的粗细,因此它更粗一些,但它仍会根据需要放大或缩小。

最后,让我们让这些旗帜图像更生动一些。SwiftUI 为我们提供了许多修改器来影响视图的呈现方式,我们将在这里使用两个:一个用于更改标志的形状,一个用于添加阴影。

Swift 中有四种内置形状:矩形、圆角矩形、圆形和胶囊。我们将在这里使用胶囊:它确保最短边的角完全圆润,而最长边保持笔直 - 它看起来非常适合按钮。使我们的图像胶囊形状就像添加.clipShape(Capsule())修饰符一样简单,如下所示:

最后,我们想在每个旗帜周围应用阴影效果,使它们真正从背景中脱颖而出。这是使用 完成的shadow(),它采用阴影的颜色、半径、X 和 Y 偏移量,但是如果你跳过颜色,我们会得到半透明的黑色,如果我们跳过 X 和 Y,它会假定它们为 0——所有合理的默认值。

因此,在前两个修饰符下方添加最后一个修饰符:

因此,我们完成的旗帜图像如下所示:

SwiftUI 有非常多的修饰符可以帮助我们调整字体和图像的渲染方式。它们都只做一件事,因此通常将它们堆叠起来,如上所示。

升级我们的设计

至此,我们已经构建了该应用程序并且运行良好,但是利用你到目前为止所学的所有 SwiftUI 技能,我们实际上可以采用我们构建的内容并重新设计它的外观 – 为我们的项目生成不同的 UI'目前已建成。这根本不会影响逻辑;我们只是在尝试一些不同的用户界面,看看你可以用你当前的知识做什么。

尝试这样的设计非常有趣,但我确实想补充一句:至少,确保你的代码在所有尺寸的 iOS 设备上运行,从微型 iPod touch 到 iPhone 13临最大。找到适合各种屏幕尺寸的东西需要一些思考!

让我们从旗帜后面的蓝黑色渐变开始。让我们继续前进是可以的,但现在我想尝试一些更奇特的东西:带有自定义停止点的径向渐变。

之前我向你展示了如何使用非常精确的渐变停止位置来调整绘制渐变的方式。好吧,如果我们创建两个彼此相同的停靠点,那么渐变就会完全消失——颜色直接从一个切换到另一个。让我们用我们当前的设计试试看:

我认为这是一个有趣的效果——就像我们在红色背景上叠加了一个蓝色圆圈。也就是说,它也很丑:那些红色和蓝色加在一起太亮了。

因此,我们可以发送这些相同颜色的淡化版本,以获得看起来更和谐的东西——旗帜中更常见的色调:

接下来,现在我们有一个VStack间距为 30 的空间来放置问题区域和标志,但我想将其减少到 15:

为什么?好吧,因为我们要把整个区域变成我们 UI 中的一个视觉元素,使它成为一个彩色的圆角矩形,这样游戏的一部分就会在屏幕上突出显示。

为此,将这些修饰符添加到相同VStack的末尾

这让它调整大小以占据它需要的所有水平空间,添加一点垂直填充,应用背景材料使其从背景的红蓝色渐变中脱颖而出,最后将整个东西剪裁成圆形矩形。

我认为这看起来已经好多了,但让我们继续努力!

我们的下一步是在我们的主框之前添加一个标题,然后添加一个乐谱占位符。这意味着我们目前所拥有的东西的另一个 VStack方面,因为VStack(spacing: 15)我们所拥有的是我们应用材质效果的地方。

因此,将你的当前内容包装VStack在一个顶部带有标题的新内容中,如下所示:

提示:要求加粗字体很常见,实际上有一个小快捷方式:.font(.largeTitle.bold()).

这会在顶部添加一个新标题,但我们也可以在该新标题的底部插入一个分数标签VStack,如下所示:

“Guess the Flag”的标题和乐谱标签在白色文本下看起来都很棒,但我们方框内的文本却不是——我们把它变成白色是因为它最初位于深色背景之上,但现在真的很难阅读了.

为了解决这个问题,我们可以删除foregroundColor()修饰符Text(countries[correctAnswer])以便它默认使用系统的主要颜色——浅色模式下为黑色,深色模式下为白色。

至于白色的“Tap the flag of”,我们可以使用iOS的vibrancy effect让背景色透出一点点。将其foregroundColor()修饰符更改为:

在这一点上,我们的用户界面或多或少可以工作,但我认为它有点太压扁了——如果你使用的是更大的设备,你会看到内容都位于屏幕中央,上下都有很多空间,中间的白框一直延伸到屏幕的边缘。

为了解决这个问题,我们将做两件事:在我们的最外层添加一点填充VStack,然后添加一些Spacer()视图以强制将 UI 元素分开。在较大的设备上,这些间隔符会分割它们之间的可用空间,但在小型设备上它们几乎会消失——这是让我们的 UI 在所有屏幕尺寸上都能正常工作的好方法。

我希望你添加四个垫片:

一个直接在“猜旗帜”标题之前。

两个(是的,两个)就在“分数:???”之前 文本。

还有一个紧跟在“Score: ???”之后 文本。

请记住,当你有多个这样的垫片时,它们会自动平分可用空间——将两个垫片放在一起会使它们占用的空间是单个垫片的两倍。

现在剩下的就是在最外面的 周围添加一点填充VStack,这样:

这就是我们更新后的设计!拥有所有这些垫片意味着在 iPod touch 等小型设备上,即使在 Pro Max iPhone 上也能平滑地放大以看起来不错。

然而,这只是我们应用程序的一种可能设计——也许你更喜欢旧设计而不是这个设计,或者你可能想尝试其他设计。关键是,你已经看到,即使你已经掌握了一些 SwiftUI 技能,也可以构建截然不同的设计,如果你有时间,我鼓励你尝试一下,看看最终结果如何!

承认吧:构建 SwiftUI 应用程序很快,不是吗?一旦你了解了你正在使用的工具,你就可以在 15 分钟内完成一个完整的游戏,然后就像我们所做的那样尝试设计,直到找到你喜欢的东西。

上一篇:

下一篇:

SwiftUI学习100天(Day 21 - 项目 2,第二部分)

原创链接:https: www hackingwithswift com 100 swiftui以下内容仅供学习参考:人们在学习编程时经常抱怨的一件事是,他们真的想忙于制作他

2023-01-24

浙江消费市场“年味”十足,迎来春节消费红火开局

央广网杭州1月23日消息(记者姜頔)兔年春节正式开启,浙江省消费市场线上线下“年味”十足,烟火气中迎来春节消费红火开局。1月21日,浙江全

2023-01-24

零下53℃是什么体验?冻梨能把板砖“敲稀碎”…

零下53℃是什么体验?1月22日7时黑龙江省大兴安岭地区漠河市阿木尔镇劲涛气象站实测最低温度-53℃突破漠河市最低气温的历史极值-52 3℃(1969

2023-01-23

59岁央视主持人朱军新年首次露面,夫妇同框拜年大秀恩爱

1月22日(年初一),长春国贸看到央视主持人朱军通过视频给大家拜年。画面中,久未露面的朱军面色圆润身材已明显发福,精神状态非常好,他身边

2023-01-23

热点聚焦:qvod 一本道_关于qvod 一本道的基本详情介绍

1、快播(又叫Qvod或Q播)是一款基于准视频点播内核的、多功能、个性化的播放软件,与传统播放软件不同的是,快播集成了不

2023-01-23

【聚看点】无名值得留名

早上10点半的场去看了无名,以为挺早的,我到的时候基本坐满了除了前排,《无名》保持了程耳导演的叙事风格-非线性叙事,但前面设疑后面解疑,

2023-01-22

三河市气象台发布寒潮蓝色预警【Ⅳ级/一般】【2023-01-22】

三河市气象台发布寒潮蓝色预警【Ⅳ级 一般】【2023-01-22】

2023-01-22

广州队可能白高兴了:只要足协归还这笔费用申花或不会降级

这段话主要包括两层意思:一是欠薪的中超俱乐部必须按3个时间节点偿还;二是如果预估2022年还会欠薪的,必须在112月8日前提交与被欠薪人员达成

2023-01-22

苹果新年降价,iPhone最低5099元,iPhone 14 Plus最低5899元_世界关注

新年伊始,可以说还是一个不折不扣的商业机会,因为走亲访友,家人团聚,很多人可能会准备看家人需要什么,而临时决定采购。而苹果也没有错过

2023-01-21

天天消息!【女×女/直女/纯爱】樱花树下

阅读前tips:1 本作为百合向作品。(审核我不多说,题目加百合标签加百合不给过)2 以下为少量补充设定双女主的设定都是魅魔,魅魔可以与同族产

2023-01-21