1、@State
当一个state只属于一个View,而且我们需要这个state去驱动我们的UI,那我们标记这个state为@State。
当一个state只属于一个View,而且我们需要这个state去驱动我们的UI,那我们标记这个state为@State。
我们来实现,将2个圆圈从顶部移动到底部。
SwiftUI 2.0 引入了LazyHStack和LazyVStack。它们的使用类似于常规的HStack和VStack,但提供了延迟加载。仅在content在设备的屏幕上变得可见前,List才开始加载content,允许用户无缝地滚动浏览大型数据集,没有明显的 UI 延迟或较长的加载时间。让我们创建一个demo来看看它在实践中是如何工作的。
当要显示的内容无法放入其容器时, 你可以使用ScrollView。
SwiftUI有5个内置的shape:
一种显示重要信息的常用View是:Alert。
SwiftUI内置支持黑暗模式。你只需要修改预览的设置,就能预览黑暗模式。
Form提供了一种从用户那里获取信息的方法。但是表格很长时,用户在完成时会感到气馁,提交表格的人很少 意味着您的调查数据更少,您的应用程序注册更少,或者提供您收集的任何数据的人更少。
我们还是来看个CoreLocation的例子。
本文将介绍用于布局相关的一些控件
snapshot test 包含2个步骤:
我们来看看一个sleep5秒的async函数。
不感兴趣,没有阅读。
不感兴趣,没有阅读。
不感兴趣,没有阅读。
什么是弹性Header?还记得你有个TableView,header是一个图片,当往下拉动tableview时,header的图片会放大。
列表视图可以包含一个到无数个item。随着列表中item数的增加,我们通常会提供在列表中搜索特定item的能力。
本章,我们将学习如何从 UIKit 视图跳转到 SwiftUI 视图,同时将文本传递给我们的 SwiftUI 视图。
还记得各种直播间中的底部不断飘起各种颜色的小红心么?
本章我们将查看
还记得我们自定义UICollectionLayout时做的那种卡片效果么,多个卡片叠在一起,我们可以用滑动手势将顶部卡片移走,显示出下面的卡片。现在我们用swiftui实现同样的功能。
我们上一篇讲了@State,如果我们有其他VIew要修改我们的State呢?
文本是任何App的一个基础。
List 和ScrollView类似,都是用来显示一个Items的集合。不同的是List更适合处理较大的数据集,因为它们不会将整个数据集加载到内存中。
自定义shape也只是使用Path组件定义好形状,然后包裹成一个Shape就行了。
表单中的某些地方可能有额外的要求,例如最小文本长度或组合大写和小写字符。我们可能想要根据 用户的输入,禁用提交按钮,直到满足所有要求。
和Lazy stack一样,lazy grid也使用lazy loading来显示一系列的items。items只会在即将出现在屏幕上时才会初始化。
XCTest和XCUITest是成熟的框架,所以你希望 SwiftUI 有类似的东西。
上个例子显示了Alert的基本用法。我们只显示了一个Ok。如果我们想要多个Btn呢?
当我们subscribe一个publisher后,这个结果需要存储到某个地方,通常我们都是通过调用.store方法存储在某个 AnyCancellable Set中。但是每个都这么用,可能会显得有点重复,我们将用@ResultBuilder来包裹所有的subscribtion,将所有AnyCancellable放到同一个set中。
async await让网络请求变得简单了,我们不用再使用回调机制了。
您可能希望改进应用的一些功能以吸引更多的用户 。比如:用户可能喜欢的不同字体,这意味着要确保设计在不同字体大小下看起来不错。SwiftUI 预览非常适合此类情况。它们允许您立即预览新内容在不同动态字体大小下的外观。
上一篇文章中我们知道了,Swiftui能够对一些通用属性进行动画,比如:位置、颜色、大小等。
我们使用@State时有一点我们可能并没有注意到,那就是多数时候都是修饰基础类型,或者struct,如果我们用@State去修饰引用类型呢?这就要小心了,因为改变引用类型内部的变量,SwiftUI并不能感知到,所以你的修改可能并不能反应到UI上。
我们将演示如何让一个banner做spring动画。
如果用户必须手动单击每个字段,填写它,然后单击填写下一个,这可能会很乏味。一个更容易和更快的方法是使用键盘上的按钮从一个表单字段跳转到下一个。
这一章,我们将介绍如何添加Image到View中。
下拉刷新的功能很常见,在swiftui中也有支持,并且支持async/await。
Confirmation dialogs 是 iOS 15 开始出现的。
我们使用PDFKit的PdfView显示pdf。不过SwiftUI要用得将其包裹为View。
ScrollViewReader允许你通过代码控制滚动到某个Index处,这个Index甚至可能在当前屏幕中并不可见。
有些View自身并不包含NavigationView,但是他又属于NavigationView stack中的一部分。
上一篇文章中,我们介绍了如何绘制自定义shape,但只使用了直线。
本章,我们将实现一个简单的注册页面,其中包含一个用户名输入框和两个密码输入框,一个用于密码,另一个用于确认密码。
如果我们每次都要用到相同的Cell,而每次都重复写一些HStack肯定不是一个好的选择,此时我们可以把这些View封装成一个Cell,增加代码的可重用性。
一开始@ObservedObject是被用来把逻辑从View中分离出去的。
UIkit我们可以通过继承UIView,然后在drawRect中使用Core Graphic Api进行绘制。
NavigationView比较适合有层次的数据,但不太适合不想关的数据。TabView就是用来组织这种数据的。
用户对列表最常见的操作无外乎:增、删、改。
SwiftUI使用sheets来present新的View(类似于UIKit的present功能),允许你往下拖动,让弹出的View消失。
目前已经是SwiftUI 3 了,但仍然无法将不同的动画连接在一起以创建一组动画。这肯定会在以后的 SwiftUI 版本中修复,但目前,我们可以使用延迟来实现一组动画。
我们可以用展开收起的列表来展示层级。
SwiftUI允许我们通过.previewDevice()修饰符,在多种屏幕尺寸上、设备类型同时预览布局。
本章将介绍如何使用各种Button。
我们将使用OpenWeather上的Api创建一个天气App,显示最近5天的天气。
如果你有一些老的代码使用completion block的方式处理异步,我们可以将其改为使用async/await的方式。
Playground支持UIKit,要使用SwiftUI,只需要将其包裹在UIHostingViewController中即可。
有时我们必须在多个视图之间共享数据,比如:ThemeManager。
之前我们已经知道了如何添加rows。
在上一篇文章中,我们介绍了如何点击底部tab,跳转不同界面。然而,我们有时候也想通过代码触发跳转。
本章,我们将学习调试Combine Stream的三种方法。我承认这三个都有点基础。但是,它们是一个起点,应该足以帮助我们了解如何处理stream中的错误。
pickers是用来提供给用户选择某个值的。
本文我们将实现一个类似于Apple Watch上的环形进度条,并用Slider控制进度。
我们来实现一个无限滚动列表。
context menus是一个弹出菜单,用于显示开发人员预期用户可能会执行的操作。context menus在 iOS 上是通过 3D Touch 触发和 macOS 上的右键单击触发。
DisclosureGroup根据disclosure control状态来控制显示和隐藏的一个视图。
创建动画有2中方式:
如果您喜欢轻松预览 UI 更改,但您的项目又只是UIkit,那么请放心 因为你也可以在构建 UIKit 应用程序时使用这个强大的功能。
本章我们将演示,如何通过EditButton来让列表进入可编辑模式。
SwiftUI 允许 我们可以同时为多个属性设置动画,也可以使用不同的持续时间和不同的动画曲线对它们进行动画处理。
弹出框是一种可以显示在屏幕上以提供有关特定项目的更多信息的视图。它们包括一个箭头,指向它们起源的位置。你可以点击任何其他屏幕区域以关闭弹出窗口。弹出框通常用于较大的屏幕,例如 iPad。
通常我们获取数据是通过 API 调用。但这可能很耗时,并很快成为瓶颈。更快的选择是仅在构建时提供一些mock数据。
SwiftUI为你提供了自定义modifiers的能力。
本章我们将用SwiftUI实现一个Tic-Tac-Toe小游戏。
SwiftUI 有几种渲染渐变的方式。渐变可用于填充 一个Shape,填充一个边框等。
Apple对ViewBuilder的定义是: 一个自定义参数, 能够从闭包中构建Views。
本章我们将实现一个List, 允许用户移动,重新组织rows。
SwiftUI能够在view出现和消失时添加动画,我们称这个未transition。
什么是hero transition?还记得我们的商品列表有个图片,点击图片,然后图片慢慢变大,成为新界面顶部的header,我们称这种为hero transition。比如:appstroe中就很常见。
使用简单的形状,可以构建一些不错的功能。例如,只需使用一堆矩形,我们就可以创建一个柱状图。
SF Symbols提供了超过3200种Symbols。
本章我们将用section实现一个静态List。
我们知道饼图是一种通过使用形成圆圈的切片来表示比例数值的方法。饼图由一个切片和一个圆组成, 在 SwiftUI 中实现它们非常简单。
在 SwiftUI 中一直可以编辑列表,但在 WWDC 2021 和 SwiftUI 3 之前,这样做非常 效率低下,因为 SwiftUI 不支持绑定到集合。让我们在集合上使用绑定并讨论它现在如何以及为什么更好地工作。
SwiftUi使用Lottie动画还得借助于UIKit。
SwiftUI 是 在 WWDC 2019 上宣布 的,仅适用于运行 iOS 13 及更高版本的设备。由于其相对不成熟,与 UIKit 相比,SwiftUI 可能缺乏广泛的 API 支持。例如,截至 2021 年 7 月,只能使用 UIKit 的UIImagePickerController选择图片和视频。因此,需要在 SwiftUI 中实现某些 UIKit API。