经验分享 未读
SwiftUI 学习笔记 65:项目 11-1关于数据存储相关的。是一个图书app。
关于 @Banding1234567891011121314151617181920212223242526272829303132333435363738394041import SwiftUIstruct TestButton: View { let ---title: String var colorOn = [Color.white, Color.orange] var colorOff = [Color.gray, Color.black] @Binding var toState: Bool var body: some View { Button(action: { self.toState.toggle() }) { Text(title) } .padding() .background(LinearGradient(gradient: ...
经验分享 未读
SwiftUI 学习笔记 54:挑战 for 35day 改进继续对昨天的程序进行改进,增加分数系统和答案查看。
在不同组件传递状态值在组件中增加binding:
1@Binding var menuClear: Bool
在有状态的父级在调用时输入变量所对应的状态值:
1AvatarButton(menuClear: $menuClear)
使用Binding时出现错误请看下一条。
在不同页面调用状态值后(使用Binding后) Previews 出现了错误12345struct HomeView_Previews: PreviewProvider { static var previews: some View { HomeView(menuClear: .constant(false)) }}
代码
GitHub:
引用站外地址,不保证站点的可用性和安全性
Multiplication_test_generation
张洪Heo
...
经验分享 未读
SwiftUI 学习笔记 46:项目 9-4 绘画那是另一个完成的项目,到目前为止,你已经体验了几乎所有SwiftUI的绘图API。你可能想重新构建应用程序,但是请花点时间暂停一下,回顾一下所学到的内容–你可能会在一段时间内不使用所有内容,但重要的是至少要记住所涵盖的内容,以便你可以请稍后再参考。
因此,今天你有另一篇评论来测试你所记得的内容,以及一些使自己编码的挑战。一如既往,这些挑战并不是我所能解决的,但这就是重点–正如美国NFL球员Troy Polamalu曾经说过的那样:“我一直有这样的心态:没有人能比我更好地挑战我。”
你可以随心所欲地解决这些问题,无论何时何地,你都可以顺利解决。另一方面,也许在完成这些练习后,你会发现一些你的知识有些动摇的地方–唯一的方法就是尝试。
挑战最好的学习方法之一是尽可能频繁地编写自己的代码,因此,你应该尝试以下三种方式扩展此应用程序,以确保你完全了解正在发生的事情。
创建一个Arrow由矩形和三角形组成的形状-使其笔直向上是很好的。
使你的Arrow形状的线粗可设置动画。
创建一个ColorCyclingRectangle形状为的矩形表亲ColorCyclingCircle,使我们可以使用属性 ...
经验分享 未读
SwiftUI 学习笔记 45:项目 9-3 绘画今天,我们将通过查看特殊效果和动画来将你的绘画技巧发挥到极致。正当我们处于绘画的前沿时,可以公平地说,这些技能不太可能在日常编码中使用,但是正如Ralph Waldo Emerson曾经说过的那样,“我们的目标是超越目标以达到目标。”
当你处理今天的主题时,你将学习如何对形状进行动画处理,这是SwiftUI感觉像魔术一样的另一个实例。但是,正如你之前所看到的,这确实不是魔术– SwiftUI只是响应我们配置视图的方式。这有点像一台Rube Goldberg机器:我们将所有设备正确设置好,使整个机器运转,然后观察正确的输出。
控制动画没有什么不同:我们不想让body视图的属性每秒重新调用60或120次才能获得平滑的动画,因此我们只是提供有关动画进行时应更改内容的说明。它不是很难发现的-也就是说,你不能偶然发现该解决方案-但我希望你同意使用起来很简单。
SwiftUI中的特殊效果:模糊,融合等SwiftUI使我们能够出色地控制视图的呈现方式,包括应用实时模糊,混合模式,饱和度调整等功能。
混合模式使我们可以控制一个视图在另一个视图上的渲染方式。默认模式是.normal,它只是将新视图中的像 ...
经验分享 未读
SwiftUI 学习笔记 44:项目 9-2 绘画今天,我们将通过增加一些创意来继续研究SwiftUI的绘图系统-我想你会惊讶地发现,仅通过将大多数已知知识与几种新技术结合起来,就可以使一件有趣的事情变得如此容易。
今天,你还将遇到drawingGroup()修饰符,该修饰符使我们可以将视图渲染结合到一起,并由Apple的高性能图形API Metal提供支持。很多人都问我的过去,我是否打算写一本关于金属,答案是明确的不 -不仅是有一个非常好的一个已经,但它也是非常难以得到什么好东西了的API 。
那不是因为Metal不好-相信我,这太不可思议了!–而是因为苹果最好的工程师在与Metal一起工作时尽了最大的努力使SwiftUI尽可能高效,而且直率地说,我不可能做得更好。
如你所见,切换Metal并不容易,即使很容易做到。著名软件开发人员肯特·贝克(Kent Beck)曾经说过,我们的流程应该是“使其正常运行,使其正确,快速”。但是,如果你发现绘图工作迅速而无需切换到Metal,通常最好保持原样。
无论如何,足够的聊天–我说过我们会做点有趣的事情,让我们开始吧!
今天,你有三个课题合作,通过在其中你将了解CGAffineTransform ...
经验分享 未读
SwiftUI 学习笔记 43:项目 9-1 绘画今天开始另一个新技术项目,我们将专注于绘图。这可能是SwiftUI的一个领域,你可能会认为你不需要太多,但事实并非如此:SwiftUI使高性能绘图变得如此容易,每个人都可以访问,你将找到可以使用自己的技能的地方在你构建的几乎所有应用中。
绘画有益的另一件事-在项目的第二部分和第三部分中将更加明显-有助于创造一种嬉戏感。在接下来的几天中,你会发现仅用几行代码就可以创建漂亮的设计,而我在准备示例并享受乐趣的过程中浪费了无数的时间。
不要相信我-著名的荷兰印象派画家梵高(Vincent Van Gogh)说:“我有时认为没有什么比绘画更令人愉快了。”
使用SwiftUI创建自定义路径SwiftUI为我们提供了Path一种用于绘制自定义形状的专用类型。这是一个非常低的级别,我的意思是你通常会希望将其包装在其他内容中以使其更有用,但是由于它是构建其他工作的基础,因此我们将从此处开始。
就像颜色,渐变和形状一样,路径本身就是视图。这意味着我们可以像使用文本视图和图像一样使用它们,尽管你会看到它有些笨拙。
让我们从一个简单的形状开始:绘制一个三角形。有几种创建路径的方法,包括一种接受关闭绘图指令的方 ...
经验分享 未读
SwiftUI 学习笔记 42:项目 8-4 宇航员随着复杂性的增加,犯错的几率也随之增加,Swift在这里是相当不容忍的-就像你现在无疑会看到的那样,即使第20行出现一个小错误也可能导致第5行出现随机错误,这可能是令人沮丧。
好吧,希望今天的报价对你有所启发。我之所以今天特别选择它,是因为最好留给读者阅读,但就是这样:不要惊慌!这些类型的问题很常见,现在解决这些问题的最简单方法是注释掉你最近添加的任何代码,并继续这样做,直到你的代码起作用为止。然后,你可以缓慢地重新引入代码,直到找到导致编译中断的部分,然后对其进行修复。
挑战最好的学习方法之一是尽可能频繁地编写自己的代码,因此,你应该尝试以下三种方式扩展此应用程序,以确保你完全了解正在发生的事情。
将启动日期添加到MissionView任务徽章下方的。
修改AstronautView以显示这位宇航员执行的所有任务。
在ContentView其中显示一个栏按钮,以在显示发射日期和显示机组人员名称之间切换。
第一个挑战应该是微不足道的,第二个挑战应该是棘手的,最后一个挑战……好吧,我们只能说它将推动你。如果花费的时间比你想象的要长得多,请不要感到惊讶!
我的代码ContentView ...
经验分享 未读
SwiftUI 学习笔记 41:项目 8-3 宇航员在今天的话题中,我鼓励你停下来并继续进行设计。我敢肯定,有些人会跳过这一想赶快走到尽头的事情,但我希望你不要。正如宇航员约翰·格伦(John Glenn)所说:“我认为,比其他任何人都更有力量的宇航员的素质都是好奇心–他们必须到达一个从未有过的地方。”
使用ScrollView和GeometryReader显示任务详细信息当用户从我们的主列表中选择一个阿波罗任务时,我们希望显示有关该任务的信息:其图像,任务徽章以及机组人员中的所有宇航员及其角色。前两个并不太难,但是第二个需要更多的工作,因为我们需要在两个JSON文件中将乘员ID与乘员详细信息进行匹配。
让我们从简单开始并逐步进行:创建一个名为MissionView.swift的新SwiftUI视图。最初,它仅具有一个mission属性,以便我们可以显示任务徽章和说明,但是不久之后我们将对其添加更多内容。
就布局而言,此东西需要滚动,VStack并带有可调整大小的任务徽章图像,然后是文本视图,然后是分隔符,以便所有内容都可以推送到屏幕顶部。我们将使用GeometryReader该图像来设置任务图像的最大宽度,尽管通过反复试验,我发现任务 ...
经验分享 未读
SwiftUI 学习笔记 40:项目 8-2 宇航员一路走来,你将遇到一个重要的Swift功能,称为generics。我绝对在初学者Swift之外也定义了此功能,但是正如你将看到的,泛型使我们仅需一点点思考就可以创建高度可重用的代码。
可重用的代码很重要,因为它可以帮助我们以更少的工作来获得更大,更好的结果。但是,正如拉尔夫·约翰逊(Ralph Johnson)所说:“在软件可重用之前,首先必须要可用” –与泛型一样好,只有先以更简单的方式解决了问题,我们才会开始使用它们。
项目名:Moonshot
加载特定种类的可编码数据在这个应用程序中,我们将两种不同的JSON加载到Swift结构中:一种用于宇航员,另一种用于任务。以易于维护且不会使我们的代码混乱的方式进行此操作需要一些思考,但是我们将逐步实现它。
首先,拖入该项目的两个JSON文件。这些可以在本书的GitHub存储库中的“ project8-files”下找到–查找astronauts.json和missions.json,然后将它们拖到项目导航器中。在添加资产时,你还应该将所有图像复制到资产目录中-这些位于“图像”子文件夹中。宇航员和任务徽章的图像都是由NASA制作的,因此根据 ...
经验分享 未读
SwiftUI 学习笔记 39:项目 8-1 宇航员如果今天的报价来自第一个登上月球的人尼尔·阿姆斯特朗,那将是合适的。早在2000年,他就说:“科学是关于什么;工程是关于可能的事情。” 我不了解你,但是我发现这给了我很大的启发:每次创建一个新的Xcode项目时,我们都有一块空白的板块可以使用,而这正是我们想要的。
今天,我们正在学习构建Moonshot的技术,但是与所有正在学习的技术一样,它们构成了你更广泛的知识的一部分,供你在未来几年中随心所欲地进行混合和重新混合。
今天,你有五个专题工作过,在你将了解GeometryReader,ScrollView,NavigationLink,等等。
使用GeometryReader调整图像大小以适合屏幕当我们Image在SwiftUI中创建视图时,它将根据其内容的尺寸自动调整自身大小。因此,如果图片为1000x500,则Image视图也将为1000x500。有时这是你想要的,但是大多数情况下,你将希望以较小的尺寸显示图像,而我想向你展示如何做到这一点,以及如何使用以下方法使图像适合用户的屏幕宽度一种称为的新视图类型GeometryReader。
首先,向你的项目中添加某种图像。没关系,只要它 ...
经验分享 未读
SwiftUI 学习笔记 38:项目 7-3 总结那是完成的另一个项目,并且涵盖了大量的Swift和SwiftUI知识。还有更多项目需要涉及,但正如F1赛车手塞巴斯蒂安·维特尔(Sebastian Vettel)所说,“有时你需要按下暂停键,让所有内容沉入其中。”
今天是你暂停一下并让SwiftUI陷入困境的机会。完成审阅,应对挑战,如果需要,可以回到以前的合并日挑战并进行应对。
如此多的人通过电子邮件向我发送诸如“我能以多快的速度学习应用程序开发?”之类的问题。老实说,我为他们感到抱歉。赶时间你不会学。这两个目标与你的大脑不相容。专注学习是当我们通过学习积极地消费信息时,这确实很重要,而分散学习是当我们停止学习并让大脑被动地在已经学习的事物之间建立联系时。休息,睡觉或一段时间做其他事情都是该过程的重要部分。
因此,如果你急于赶上明天的新项目,请遵循维特尔的建议:按一下暂停,让所有内容沉入其中。
挑战最好的学习方法之一是尽可能频繁地编写自己的代码,因此,你应该尝试以下三种方式扩展此应用程序,以确保你完全了解正在发生的事情。
向其中添加“编辑/完成”按钮,ContentView以便用户可以更轻松地删除行。
修改费用金额Con ...
经验分享 未读
SwiftUI 学习笔记 37:项目 7-2 消费记录APP今天,你会使用来构建一个完整的应用程序@ObservedObject,@Published,sheet(),Codable,UserDefaults,等等。我意识到这似乎很多,但我希望你尝试考虑后台发生的所有事情:
@Published 自动发布变更公告。@ObservedObject 监视这些公告并使用该对象刷新所有视图。sheet() 观看我们指定的条件并自动显示或隐藏视图。Codable 可以将Swift对象转换为JSON,然后几乎不需要我们提供任何代码。UserDefaults 可以读取和写入数据,以便我们可以更即时地保存设置。是的,我们需要编写代码以将这些内容放置在适当的位置,但是由于删除了许多样板代码,因此剩下的内容非常出色。正如法国作家和诗人安托万·德·圣艾修伯里(Antoine de Saint-Exupery)曾经说过的那样:“完美无缺,只有在没有更多可添加的东西时才能实现,而只有在没有更多需要补充的时候才能实现。”
项目名:iExpense
建立我们可以从中删除的列表在此项目中,我们需要一个可以显示一些费用的列表,以前,我们将使用@State对象数组来完成此操作。不 ...
经验分享 未读
SwiftUI 学习笔记 36:项目 7-1 概述没有人应该开始进行大型项目。你从一个小的琐碎项目开始,并且永远不要期望它会变大。如果这样做,你只会进行过度设计,并且通常认为它比该阶段可能要重要的多。或更糟糕的是,你所设想的庞大工作量可能会吓到你。
该项目继续更新
与@ObservedObject共享SwiftUI状态@State 只能监控 结构 的更改,很难监控到 类 的更改,这个时候需要使用@ObservedObject
如果你想使用一个类与SwiftUI数据-你会想要做的,如果该数据跨多个视图共享-然后SwiftUI给了我们两个属性包装是有用的:@ObservedObject和@EnvironmentObject。稍后我们将研究环境对象,但现在让我们集中关注观察到的对象。
这是一些创建User类的代码,并在视图中显示用户数据:
1234567891011121314151617class User { var firstName = "Bilbo" var lastName = "Baggins"}struct ContentView: View { ...
经验分享 未读
SwiftUI 学习笔记 35:项目 4-6 总结“你不应该双手抓住捕手的手套度过一生-你必须能够向后扔东西。”
ForEach和List使用数字范围正如我已经说过几次,当我们在一个循环中创建视图时,SwiftUI需要了解如何唯一地标识每个项目,以便它可以对来回的数据进行动画处理。这本身并不复杂,但是有一种特殊的用法会把人们拒之门外,这就是range。
首先,让我们看一些代码:
123ForEach(0..<5) { Text("Row \($0)")}
从0到5循环播放,每次打印出一些文本。SwiftUI可以确保每个项目都是唯一的,因为它在一个范围内计数,并且范围没有重复的值。
实际上,如果你查看我们背后的SwiftUI代码,ForEach你会发现它实际上是这样的:
1public init(_ data: Range<Int>, @ViewBuilder content: @escaping (Int) -> Content)
视图生成器(实际上是构成视图的东西)将从范围中获得一个整数,并有望发送回一些可以呈现的视图内容。
现在尝试编写以下代码:
123Fo ...
经验分享 未读
SwiftUI 学习笔记 34:项目 6-3 动画 挑战这个技术项目起步比较容易,经过几番曲折,然后发展为更高级的动画,但是我希望它给你一个强大而灵活的想法!– SwiftUI的动画系统。
正如我之前所说,动画既要使你的应用看起来很棒,又要增加额外的含义。因此,除了让视图突然消失之外,你还可以添加一个过渡来帮助用户了解正在发生的变化吗?
另外,不要忘记在用户界面中看起来很有趣。我一直以来排名第一的最喜欢的iOS动画是Apple移至iOS 7时抛弃的动画,它是用于在电子钱包应用中删除通行证的动画–出现了金属粉碎机,将通行证切成十几条,然后掉了下来。它仅比当前动画花费了几分之一秒的时间,但它也很有趣。
挑战返回到Guess the Flag项目并添加一些动画:
当你点击正确的标志时,使其在Y轴上旋转360度。
使其他两个按钮淡出至25%的不透明度。
如果你点击了错误的标志?好吧,这取决于你–发挥创意!
代码点击错误的标志后,正确的标志会有一个无限循环的缩放动画
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 ...
经验分享 未读
SwiftUI 学习笔记 33:项目 6-2 动画有一位来自德国的著名工业设计师Dieter Rams。你可能没有听说过他,但你肯定已经看过他的作品- 从iPod到iMac和Mac Pro,多年来他的设计极大地启发了Apple自己的设计。他曾经说过:“好的设计使事物变得可理解和令人难忘;出色的设计可以使人留下深刻的印象。”
修饰符顺序在Swift中的修饰符根据顺序有关。例如
123456Button("Tap Me") { // do nothing}.background(Color.blue).frame(width: 200, height: 200).foregroundColor(.white)
和
123456Button("Tap Me") { // do nothing}.frame(width: 200, height: 200) .background(Color.blue).foregroundColor(.white)
所代表的含义有所不同。可以理解为代码由上往下运行。
多个动画修饰符控制动画当同时出现多个动画 ...
经验分享 未读
SwiftUI 学习笔记 32:项目 6-1 动画自从2001年Mac OS X推出以来,史蒂夫·乔布斯(Steve Jobs)推出了Aqua这个视觉主题,而该主题一直为macOS提供动力,他说:“我们使屏幕上的按钮看起来好得让人想要舔它们。”我不知道是否你在那时使用Macs,但是多年来,Aqua一直给我们提供类似玻璃的按钮,大头针条纹,拉丝金属等等,甚至到今天,“精灵”窗口也将外观最小化。
当我们制作具有出色视觉吸引力的应用程序时,用户会注意到。当然,它不会影响应用程序的核心功能,很容易过分设计,导致该核心有点丢失,但是当你正确操作时,漂亮的用户界面会带来一点额外的乐趣,并且可以帮助你将你的应用与众不同。
关于 CGFloat由于历史原因,主要是与Apple的旧API交互的原因,我们需要使用一种称为的特定数据类型CGFloat。
CGFloat出于各种意图和目的,它是Double一个不同的名称,但在较旧的硬件上,它使用的数字存储类型较小,称为Float。当这个选择很重要时,CGFloatApple不必在乎我们要为哪种类型的硬件建造,但如今几乎所有东西都在使用,Double因此,厌恶地盯着我们只是一小块遗产。
无论如何,所有这些都很重 ...
经验分享 未读
SwiftUI 学习笔记 31:项目 5-3 挑战巨石强森(Dwayne“ The Rock” Johnson)曾经说过:“成功并不总是与伟大有关,而是与一致性有关。一贯的努力导致成功;伟大将会来临。”
挑战
不允许答案少于三个字母或与我们的起始单词相同。对于三字母检查,最简单的操作是将一个检查放入isReal(),如果单词长度在三个字母以下,则返回false。对于第二部分,只需将起始词与输入词进行比较,如果相同则返回false。
添加一个称为的左键按钮项startGame(),以便用户可以在需要时以一个新单词重新启动。
在下方放置一个文本视图,List以便你可以跟踪并显示给定根词的玩家得分。如何计算分数取决于你,但是涉及单词数量及其字母数的内容是合理的。
自定的得分规则
拼写的单词所含字母数量
3
4
5
6
7
8
超过8
得分
1
2
4
8
12
20
40
并且在拼写第4个单词开始,每拼写成功一次额外加5分
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545 ...
经验分享 未读
SwiftUI 学习笔记 30:项目 5-2 单词游戏尽量记住美国作家和讲师Dale Carnegie的一些著名话:
“不要害怕尽力去做看似小的工作。每次征服一个职位,都会使自己变得强大—如果你的小工作做得好,那么大的工作往往会照顾自己。”
在函数中使用guard来检查是否满足一定条件否则退出在函数中可以使用guard来检查,例如:
123guard answer.count > 0 else { return }
将单词全部小写并删除空格和换行符1let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
输入框按下return执行函数1TextField("Enter your word", text: $newWord, onCommit: addNewWord)
在数组头部插入内容我们有的时候需要将内容插入到数组的第一个元素中:
1usedWords.insert(answer, at: 0)
禁用输入框第一个字母大写1.autocapit ...
经验分享 未读
SwiftUI 学习笔记 29:项目 5-1 单词游戏这个项目将是另一个游戏,尽管实际上这只是我介绍更多Swift和SwiftUI知识的一种偷偷摸摸的方式!游戏将向玩家显示一个随机的八个字母的单词,并要求他们用单词来制作单词。例如,如果入门单词为“ alarming”,则它们可能拼写为“ alarm”,“ ring”,“ main”等。
沿途你会见到的方式List,onAppear(),Bundle,fatalError(),等等-所有有用的技能,你会使用几年来。你还可以得到一些练习用@State,Alert,NavigationView,多,你应该一边可以欣赏-这是我们最后一次容易的项目!
List 的使用我们有的时候使用List作为列表时,列表的内容会分为静态数据和动态数据。
静态12345List { Text("Hello World") Text("Hello World") Text("Hello World")}
动态12345List { ForEach(0..<5) { Tex ...
经验分享 未读
SwiftUI 学习笔记 28:挑战 4-3 睡眠时间预测挑战
将VStack表单中的每个替换为Section,其中文本视图是该部分的标题。你喜欢此布局还是该VStack布局?这是你的应用-你可以选择!
用Picker显示相同数值范围的“杯数”步进器代替。
更改用户界面,以使其始终使用漂亮的大字体显示建议的就寝时间。你应该可以完全删除“计算”按钮。
遇到的困难ForEach数字循环需要从0开始ForEach中第1个变量可以用 $0 代替在此项目情境下,使用do catch组合时,return要放在do catch内。
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495import SwiftUIstruct ContentView: View { @State private var sleepAmount = ...
经验分享 未读
SwiftUI 学习笔记 27:项目 4-2 睡眠时间预测NavigationView 中导航栏添加按钮
使用 .navigationBarItems
123.navigationBarItems(trailing: // our button here)
按钮调用一个方法首先,我们需要一个用于按钮调用的方法,因此添加一个空calculateBedtime()方法,如下所示:
12func calculateBedtime() {}
在我们的案例中,我们想用“计算”按钮替换该注释。之前我曾解释过按钮有两种形式:
123456789Button("Hello") { print("Button was tapped")}Button(action: { print("Button was tapped")}) { Text("Hello")}
如果需要,我们可以在这里使用第一个选项:
123Button("Calculate") ...
经验分享 未读
SwiftUI 学习笔记 26:项目 4-1 睡眠时间预测步进器
123Stepper(value: $sleepAmount, in: 4...12, step: 0.25) { Text("\(sleepAmount, specifier: "%.2f") hours") }
in代表范围,step代表每次点击变化的幅度。value绑定之前设置过的@state状态。
日期选择器使用日期选择器之前需要创建一个Date()属性:
1@State private var wakeUp = Date()
然后,你可以将其绑定到日期选择器,如下所示:
123var body: some View { DatePicker("Please enter a date", selection: $wakeUp)}
如果要隐藏日期选择器的标题,除了删除掉文本标签(这样会使屏幕阅读器的用户无法使用)还可以将日期选择器包裹在Form表单
12345var body: some View { Form ...
经验分享 未读
SwiftUI 学习笔记 25:项目 1-3 总结你学到了什么
你现在已经完成了前两个SwiftUI项目,并且还完成了一个技术项目–两个应用程序的相同节奏和一个技术项目一直持续到课程结束,并且将帮助你在花时间的同时快速提高知识水平返回并完善你所学。
尽管我们只是SwiftUI的三个项目,但你已经了解了一些最重要的概念:视图,修饰符,状态,堆栈布局等–这些是你将在SwiftUI中一次又一次使用的技能,为什么我想早点把它们弄下来,
当然,你还构建了一些实际项目并完成了许多编码挑战,以帮助巩固你的学习,因此希望你开始对自己的知识有所了解。
到目前为止,我们已经介绍了:
构建将文本与控件(例如)混合的滚动表单,PickerSwiftUI会变成漂亮的基于表格的布局,在其中可以以新的选择滑动新屏幕。
创建一个NavigationView并为其命名。这不仅使我们能够将新的视图推送到屏幕上,而且还使我们能够设置标题并避免日以继夜的内容出现问题。
如何使用@State存储变化的数据,以及为什么需要它。请记住,我们所有的SwiftUI视图都是结构,这意味着如果没有类似的内容就无法更改它们@State。
为TextField和等用户界面控件创建双向绑定P ...
经验分享 未读
SwiftUI 学习笔记 24:项目 3-2 挑战挑战
最好的学习方法之一是尽可能多地编写自己的代码,因此,你应该尝试以下三种方式扩展此应用程序,以确保你完全了解正在发生的事情:
挑战1创建一个自定义ViewModifier(和附带的View扩展名),使视图具有适合视图中显着标题的大的蓝色字体。
12345678910111213141516171819202122232425262728293031import SwiftUIstruct ---title: ViewModifier{ func body(content: Content) -> some View { content .font(.title) .foregroundColor(.blue) }}extension View { func titleStyle() -> some View { self.modifier(Title()) }}struct Con ...
经验分享 未读
SwiftUI 学习笔记 23:项目 3-1 自定义修饰符和自定义容器背景填充整个屏幕
我们可以通过使用frame()修饰符来做到这一点,同时传入.infinity其最大宽度和最大高度。
123Text("Hello World") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.red)
使用maxWidth并maxHeight与使用不同width和height-我们不是说文本视图必须占用所有的空间,只知道它可以。如果周围还有其他视图,SwiftUI将确保它们都获得足够的空间。
默认情况下,你的视图不会离开安全区域,但是你可以使用如下edgesIgnoringSafeArea()修饰符来更改它:
1234Text("Hello World") .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.red) .edgesIgnoringSafeArea(.all)
条件修饰符如果你拥有一个可以为true或false的 ...
经验分享 未读
SwiftUI 学习笔记 22:项目 2-3 挑战挑战
最好的学习方法之一是尽可能频繁地编写自己的代码,因此,你应该尝试以下三种方式扩展此应用程序,以确保你完全了解正在发生的事情:
添加一个@State属性来存储用户的分数,在答案正确与否时对其进行修改,然后将其显示在警报中。
在标志正下方的标签中显示玩家的当前得分。
如果有人选择了错误的标志,请在你的警报消息中告诉他们他们的错误-诸如“错误!那就是法国的国旗。”
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182//// ContentView.swift// GuessTheFlag//// Created by 张洪Hoo on 2020/1/20.// Copyright © 2020 张洪Hoo. All rights reserved.//import SwiftUIstruct ContentView: ...
经验分享 未读
SwiftUI 学习笔记 21:项目 2-2 制作猜国旗应用生成随机数
1var correctAnswer = Int.random(in: 0...2)
该Int.random(in:)方法会自动选择一个随机数
在按钮上插入图片123456Button(action: { // flag was tapped }) { Image(self.countries[number]) .renderingMode(.original) }
该renderingMode(.original)修饰符告诉SwiftUI呈现原始图像的像素,而不是试图重新着色他们作为一个按钮。
随机化数组顺序shuffled()方法会自动为我们处理随机化数组顺序。
1var countries = ["Estonia", "France", "Germany", "Ireland", "Italy", "Nigeria", "Poland&q ...
经验分享 未读
SwiftUI 学习笔记 20:项目 2-1 制作猜国旗应用填充颜色
除了使用.background(Color.red)以外的方式,我们还可以用ZStack来设置颜色:
如果要在文本后面的整个区域填充红色,则应将颜色单独放置为ZStack–视为整体视图:
1234ZStack { Color.red Text("Your content")}
实际上,它本身Color.red 就是一种视图,这就是为什么可以像形状和文本一样使用它的原因。它会自动占用所有可用空间,但是你也可以使用frame()修饰符来询问特定的大小:
1Color.red.frame(width: 200, height: 200)
内置颜色、语义颜色SwiftUI为我们提供了内置的色彩与工作,比如一些Color.blue,Color.green等等。我们也有一些语义颜色:这些颜色不会说出它们所包含的色调,而是描述它们的用途。
例如,Color.primary是SwiftUI中文本的默认颜色,根据用户设备是在亮模式还是暗模式运行,颜色将为黑色或白色。也有Color.secondary,根据设备的不同,颜色也可能是黑色或白色 ...
经验分享 未读
SwiftUI 学习笔记 19:挑战 1 单位转换应用这是第一个挑战日,挑战日题目:
你的挑战你需要构建一个处理单位转换的应用程序:用户将选择一个输入单位和一个输出单位,然后输入一个值,然后查看转换的输出。
你选择哪种单位取决于你,但是你可以选择以下单位之一:
温度转换:用户选择摄氏度,华氏度或开氏度。
长度转换:用户选择米,公里,英尺,码或英里。
时间转换:用户选择秒,分钟,小时或天。
体积转换:用户选择毫升,升,杯,品脱或加仑。
如果要进行长度转换,则可能有:
输入单位的米,千米,英尺,码或英里的分段控件。第二个分段控件,用于输出单位的米,公里,英尺,码或英里。用户在其中输入数字的文本字段。文本视图,显示转换结果。因此,如果选择米作为源单位,将英尺作为输出单位,然后输入10,则将看到32.81作为输出。
提示你已经知道完成该项目所需的一切,但是如果遇到问题,那么我会提供一些可能有用的提示。
首先,我们所有的单位转换都是简单的数学运算,但是你不应该尝试编写将转换从每个源单位转换为另一个单位的转换。一个更好的主意是将用户的输入转换为单个基本单位,然后从那里转换为目标单位。
因此,与其编写代码来将公升转换成毫升,从公升转换成杯子,从公升 ...