首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何让 SwiftUI 的列表变得更加灵活

使用新速记语法 让我们从一个很小的特性开始,这是一个非常受欢迎的变化,可以使用类似 enum 的速记语法来引用 SwiftUI 附带的任何内置 ListStyle 类型。...为了演示这种情况,我们在 List 嵌套一个 ForEach (因为在 SwiftUI,列表变化一版都是由 ForEach 触发的,而不是由 List 触发的)。...然后,让我们使用另一个新功能,集合元素绑定,让系统自动为我们的 articles 数组的每个元素创建一个可变绑定: struct ArticleList: View { @ObservedObject...可定制的分隔符 自从引入 SwiftUI 以来,开发者们有一个非常普遍的要求,提供一个 API ,用于隐藏或以其他自定义实现列表每个 item 之间的默认分隔符。...总结 SwiftUI 正在变得更加灵活和强大,后面我继续探索更多新推出的 API,并在这里发布分享,欢迎持续关注,为了防止丢失,建议为本号设置星标。

4.8K41
您找到你想要的搜索结果了吗?
是的
没有找到

Ask Apple 2022 与 SwiftUI 有关的问答(上)

是否有任何建议用来检测列表的行选择,类似于 “NavigationLink”,但不导航另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...只有这些变量重构视图模型中去这一种方式?A:如果在同一个视图中,有多个相互关联的 @State 属性,将他们提取到一个结构或许是好的选择。...事实上,这些视图( 惰性容器视图 )一旦被创建,其存续期持续惰性容器被销毁为止。请阅读 SwiftUI 视图的生命周期研究[12] 了解更多内容。...但是从一个文本字段一个文本字段的聚焦感觉不够流畅,而且每当我在一个文本字段输入一个字母时,我的 CPU 使用率似乎会飙升到 70% — 100%。...我在同一个子上下文中创建一个新的托管对象,并希望这个对象发送到一个新的窗口。

12.2K20

Ask Apple 2022 与 SwiftUI 有关的问答(下)

背景扩展安全区域Q:如果我有一个自定义的容器类型,可以接受一个顶部和底部的视图,是否有办法让 API 的调用者所提供的视图的背景扩展安全区域内,同时内容( 文本或按钮 )保留在安全区域内?...这意味着我们不能使用 LazyVStack,或任何其他选择与详细视图绑定的自定义视图。有扩展这个功能的计划吗?A:在 iOS 16.1 ,你可以在侧边栏里放一个。...macOS APIQ:对于运行 Monterey 的 Mac,能否如何在 SwiftUI 实现下面需求的建议:打开一个窗口在该窗口中初始化数据找到所有打开的窗口确定一个窗口是否打开从不在该窗口的视图中关闭一个窗口...连锁动画Q:在 SwiftUI ,如何实现连锁动画?例如,我想先给一个视图做动画,当动画完成后立即启动另一个动画。A:不幸的是,目前不可能实现连锁动画。...视图的功能分散函数、更小的视图结构以及视图修饰器当中是很好的解决方法。

14.7K30

SwiftUI 的动画机制

SwiftUI 采用了声明式语法来描述不同状态下的 UI 呈现,动画亦是如此。官方文档 SwiftUI 的动画(Animations)定义为:创建从一个状态另一个状态的平滑过渡。...在 SwiftUI ,我们不能命令某个视图从一个位置移动到另一个位置,为了实现上述效果,我们需要声明该视图在状态 A 时所处的位置以及状态 B 时所处的位置,当由状态由 A 转到 B 时,SwiftUI...在 SwiftUI ,实现一个动画需要以下三要素: 一个时序曲线算法函数 状态(特定依赖项)同该时序曲线函数相关联的声明 一个依赖于该状态(特定依赖项)的可动画部件 animationThreeElements...状态、视图标识、动画 既然 SwiftUI 的动画是创建从一个状态另一个状态的平滑过渡,那么我们必须对状态(依赖项)的改变可能导致的结果有正确的认识。...总结 动画是创建从一个状态另一个状态的平滑过渡 声明一个动画需要三要素 掌握状态的变化所能导致的结果 —— 同一个视图的不同状态还是不同的视图分支 时序曲线函数与依赖的关联越精准,产生异常动画的可能性就越小

14.6K40

@State 研究

本文试图探讨并分析SwiftUI @State的实现方式和运行特征;最后提供了一个有关扩展@State功能的思路及例程。读者需要对SwiftUI的响应式编程有基本概念。...研究的意义何在 我在去年底使用了SwiftUI写了第一个 iOS app 健康笔记,这是我第一次接触响应式编程概念。在有了些基本的认识和尝试后,深深的被这种编程的思路所打动。...通过一段时间的研究和分析,我打算用两篇文章来阐述这方面的问题,并尝试提供一个现阶段的使用思路。 数据(状态)驱动 在SwiftUI视图是由数据(状态)驱动的。...: 1.通过使用@State,我们可以在未使用mutating的情况下修改结构2.当状态发生变化后,视图自动重绘以反应状态的变化。...我们可以绑定多种类型,包括 State ObservedObject 等,甚至还可以绑定另一个Binding上面。Binding本身就是一个Getter和Setter的封装。

2.9K20

SwiftUI:使用 @EnvironmentObject 从环境读取自定义

SwiftUI的环境使我们可以使用来自外部的,这对于读取Core Data上下文或视图的展示模式等很有用。...好吧,@ EnvironmentObject更进一步:我们可以将对象放置环境,以便任何子视图都可以自动访问它。...如果我们使用@ObservedObject,则需要将我们的对象从每个视图传递一个视图,直到它最终到达可以使用该视图视图E,这很烦人,因为B,C和D不在乎它。...现在,我们可以这两视图放在一个地方,并发送一个User实例供它们使用: struct ContentView: View { let user = User() var body:...好吧,您已经了解字典如何让我们使用一种类型作为键key,而另一种类型作为。环境有效地使我们可以数据类型本身用作键,并将类型的实例用作

9.5K20

架构之路 (五) —— VIPER架构模式(一)

开始 首先看下主要内容: 在本教程,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...List一个项目中,将自动启用滑动操作来删除行为。...router处理从一个屏幕另一个屏幕的转换,设置下一个视图所需的类。 在命令式UI范例——换句话说,在UIKit——路由router负责显示视图控制器或激活segue。...当您将其放置在NavigationView时,该链接将成为一个按钮,destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。...trip名称分隔成这样的属性允许您同步该,而不需要创建一个无限循环的更新。

17.4K10

我庆幸果断放弃了SwiftUI:它还不够成熟

考虑配套创作工具 CiderKit 在发展成熟的过程也变得愈发复杂,再加上创建各种窗口和 UI 元素的实际需求,我决定尝试用用 SwiftUI。...但每当 SwiftUI 更新检查器视图时(这种更新可能出现在移动过程,甚至是在输入文本字段的时候),渲染速率都会下降到每秒 10 15 帧,而且相当不稳定。这显然让人无法容忍。...我在网上查找了解决方案,最后编写了一个延迟版本的 ObservableObject,由它来强制每秒只发布一次更改(参见以下代码)。...但这会导致检查器出现延迟,因此在地图编辑器的交互过程(比如使用移动工具时)结果不准确,所以效果还是称不上完美。 但我觉得这可能只是独立问题,并不能因此把 SwiftUI 一棒子打死。...越来越慢 在实现了第一个检查器之后,我开始研究另一个主题:Sprite 资产编辑器。利用这款工具,我可以用多个 sprite 拼接成复杂的资产,再最终为它们制作动画。

4.9K20

SwiftUI 状态管理系统指南

前言 SwiftUI与苹果之前的UI框架的区别不仅仅在于如何定义视图和其他UI组件,还在于如何在整个使用它的应用程序管理视图层级的状态。...比如字符串或整数,而是可以用来任何Swift绑定到我们的一个视图中。...作为一个例子,让我们更新上面定义的ProfileView——通过管理User模型的责任从视图本身转移到一个新的、专门的对象。...尽管在一个视图和它的一个视图之间创建绑定通常很容易,但在整个视图层次结构传递某个对象或可能相当麻烦——而这正是环境变量旨在解决的问题类型。 有两种主要的方法来使用SwiftUI的环境。...——我们可以将其应用于我们的层次结构何在其之上的视图

5K20

掌握 SwiftUI 的 Safe Area

在 UIKit ,开发者需要利用 safeAreaInsets 或 safeAreaLayoutGuide ,才能确保视图放置在界面的可见部分。 SwiftUI 对上述过程进行了彻底的简化。...本文探讨如何在 SwiftUI 获取 SafeAreaInsets、视图绘制安全区域之外、修改视图的安全区域等内容。...对于视图层次上的其他视图,safeAreaInesets 只反映视图中被覆盖的部分。如果一个视图可以完整地放置在父视图的安全区域中,该视图的 safeAreaInsets 为 0。...这是因为,我们并没有正确的设置 ignoresSafeArea 另一个重要的参数regions。...safeAreaInsetList2 遗憾的是,在 iOS 15 之前,SwiftUI 并没有提供调整视图安全区的手段,如果我们想通过 SwiftUI 的手段创建一个自定义 Tabbar 时,列表中最后的内容将被

7.5K31

SwiftUI 与 Core Data —— 数据获取

本文中我们探讨在 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。...类 Redux 框架通常都建议开发者整个 app 的状态合成一个单一的结构实例( State ,符合 Equatable 协议 ),视图通过观察状态的变化( 有些框架支持切片式的观察以改善性能 )...简单介绍一下我探索过程( 以 TCA 框架进行举例 ):在 Reducer 获取并管理数据在 task( 或 onAppear )通过发送 Action 启动一个长期的 Effect ,创建一个...不可在 update 方法同步地改变引发视图更新的数据与 SwiftUI视图中更新 Source of truth 的逻辑一致,在一个视图更新周期中,不能对 Source of truth 再度更新...在下一篇文章,我们探讨如何在 SwiftUI 安全地响应数据,如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。希望本文能够对你有所帮助。

4.6K30

优化在 SwiftUI List 显示大数据集的响应效率

本文通过一个优化列表视图的案例,展现在 SwiftUI 查找问题、解决问题的思路,其中也会对 SwiftUI 视图的显式标识、@FetchRequest 的动态设置、List 的运作机制等内容有所涉及...考虑当前的卡顿出现在进入视图的时刻,我们可以查找问题的关注点集中在如下几个方面: Core Data 的性能( IO 或 惰填充 ) 列表视图的初始化或 body 求值 List 的效能 Core...标识为随时间推移而变化的视图提供了一个坚固的锚,它应该是稳定且唯一的。...另外如果 id 的标识发生变化,SwiftUI 丢弃原视图(生命周期终止及重置状态)并重新创建新的视图。...虽然我们已经找到了导致进入列表视图卡顿的原因,但如何在不影响效率的情况下通过 scrollTo 来实现列表端点的滚动呢?

9.1K20

SwiftUI中使用UIKit视图

SwiftUI中使用UIKit视图 想获得更好的阅读体验可以访问我的博客www.fatbobman.com,或点击下方的阅读原文 已迈入第三年头的SwiftUI相较诞生初始已经提供了更多的原生功能...本文通过对UITextField的包装来讲解以下几点: •如何在SwiftUI中使用UIKit视图•如何让你的UIKit包装视图具有SwiftUI风格•在SwiftUI使用UIKit视图需要注意的地方...该方法在UIViewRepresentable的生命周期中会多次调用,直到视图被移出视图树(更准确地描述是切换到另一个不包含该视图视图树分支)。...例如,UIKit我们一个代理对象附加到Text field视图上,当用户输入时,当用户按下return键时,该代理对象对应的方法将被调用。...font 我们也可以自己创建环境来实现对TextFieldWrapper的配置。比如,SwiftUI提供的font环境的类型为Font,本例我们创建一个针对UIFont的环境设定。

8.1K20

何在 SwiftUI 视图中显示应用图标和版本

在本文中,我展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图标和版本,又能在各种文本大小和外观下看起来都很好:获取应用图标构建视图的第一步是从主包获取应用图标。...创建 SwiftUI 视图现在让我们所有内容结合起来,创建一个 SwiftUI 视图,显示应用图标和版本:AppVersionInformationView.swiftimport SwiftUIstruct...这些通过我们之前创建的提供者传递给视图。我们在一个水平堆栈显示应用图标和版本,间距为12点。我们在 Image 视图中显示应用图标。...我们学习了如何在 SwiftUI 应用显示应用图标和版本信息。...在获取到应用图标和版本信息后,我们创建了一个 SwiftUI 视图来展示这些信息。该视图使用水平堆栈(HStack)布局,应用图标和版本信息并排显示。

11222

SwiftUI TextField进阶——格式与校验

本文为【SwiftUI 进阶】系列文章的一篇,在本文中,我介绍如何在TextField实现如下功能: •屏蔽无效字符•判断录入的内容是否满足特定条件•对录入的文本实时格式化显示 textfieldDemo1...如何在TextField检查内容是否符合指定条件 相较上述两目标,在SwiftUI检查TextField内容是否符合指定条件是相当方便的。...由于onChange是在文字发生变化后才会调用,因此,方案二会导致视图二度刷新,不过考虑文字录入的应用场景,性能损失可以忽略( 使用属性包装器进一步对数值同字符串进行链接,可能会进一步增加视图的刷新次数...不利于判断用户是否录入新的信息(更多的信息可参阅如何在SwiftUI创建一个实时响应的Form[10])。方案二允许不提供初始,支持可选。...SwiftUI创建一个实时响应的Form: https://www.fatbobman.com/posts/swiftui-input-form/

8.1K20

【visionOS】从零开始创建第一个visionOS程序

将你的应用扩展沉浸式空间 从熟悉的基于窗口的体验开始,向人们介绍您的内容。从那里,添加特定于visionOS的SwiftUI场景类型,卷和空间。...在visionOS,您可以在同一个场景包含2D和3D视图,并且可以这些视图呈现在窗口中或作为人的周围环境的一部分。...系统会自动将以下类型的输入映射到你的SwiftUI事件处理代码: 这张照片显示的是窗户角落里的控件,以及一个人坐在椅子上,双手放在膝盖上的自上而下的叠加视图。 间接的输入。...当指定的手势发生在实体上时,SwiftUI执行提供的闭包。 下面的示例一个点击手势识别器添加到上一个示例的球体视图中。...如果你的应用程序定义了多个空格,你必须在显示一个不同的空格之前取消当前可见的空格。如果不取消可见空间,那么当您尝试打开另一个空间时,系统发出运行时警告。

73640

SwiftUI 动画进阶 — Part4:TimelineView

两者之间的唯一区别是,一个写在内容闭包,而另一个被放在单独的视图中以提高可读性。...为什么左边的 emoji 会变,而另一个总是悲伤?事实证明, SubView 没有接收到任何变化的参数,这意味着它没有依赖关系。SwiftUI 没有理由重新计算视图的主体。...笔者将在本节中介绍的技术,使用我们已熟知的动画并且热衷于视图动画从一个时间线更新到下一个时间线。这最终将让我们在纯 SwiftUI 创建我们自己的类似关键帧的动画。...因此,你可以定义一个具有动画类型的枚举,而不是在数组包含 Animation 。稍后在你的视图中,你根据动画类型创建动画,但使用偏移的持续时间对其进行实例化。...嵌套 TimelineViews:没有什么能阻止你一个 TimelineView 嵌套在另一个 TimelineView

3.7K30
领券