自定义布局Q:我经常想根据列表中最长或最短的文字来布置各种小组件。鉴于动态文本大小在应用程序运行时可能会发生变化,衡量给定字体的文本大小的最佳方法是什么?A:你好!我们新的布局协议支持这个功能。...Swiftcord[12] 的代码展示了如何在 SwiftUI 下实现倒置列表。阅读 优化在 SwiftUI List 中显示大数据集的响应效率[13] 一文,了解苹果工程师推荐的方法。...将背景扩展到安全区域Q:如果我有一个自定义的容器类型,可以接受一个顶部和底部的视图,是否有办法让 API 的调用者将所提供的视图的背景扩展到安全区域内,同时将内容( 如文本或按钮 )保留在安全区域内?...这意味着我们不能使用 LazyVStack,或任何其他将选择与详细视图绑定的自定义视图。有扩展这个功能的计划吗?A:在 iOS 16.1 中,你可以在侧边栏里放一个。...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被从 SwiftUI 框架中移除;2、不支持懒加载,即使和 Lazy 视图一起使用也会一次性加载全部的视图。
SwiftUI 视图的生命周期研究 访问我的博客 www.fatbobman.com[1] ,获得更好的阅读体验 在 UIKit(AppKit)的世界中,通过框架提供的大量钩子(例如 viewDidLoad...视图值树 在 SwiftUI 中,视图是状态的函数[2]。 开发者通过符合 View 协议的结构体来声明界面,SwiftUI 通过调用结构体实例的 body 获取对应的视图值。...但 SwiftUI 并非一定会从新的实例中获取 body 结果,如果之前的实例注册过数据依赖,视图值树仍可能会从原来的实例的 body 中获取结果。...比如在 List 和 LazyVStack 中,Cell 视图在创建之后即使滚动出屏幕不参与布局与渲染,但 SwiftUI 仍会保留这些视图的数据,直到 List 或 LazyVStack 被销毁。...•在 List 和 LazyVStack 中,SwiftUI 出于效率的考虑,即使 Cell 视图移出显示范围,它的视图仍将保留在视图值树上(视图仍将存续)。
SwiftUI 通过调用视图实例的 body 属性来获取视图值。...不过 ViewBuilder 却允许开发者可以通过 let 或 var 在视图声明中定义常量或变量,它们具体有什么作用呢?...不过就和通过 let _ = print("update") 能够帮助我们了解视图的动态一样,掌握了在 body 中通过 var 创建变量及应用的方法,也将有助于开发者更好地理解 SwiftUI 视图的求值逻辑并掌握其时机...image-20230321203001315 假如,我们将 VStack 换成 List 或 LazyVStack 呢?...在 SwiftUI 所有的惰性容器中,都会出现计算两次的情况( 或许与惰性容器的视图值保存机制有关 ),这就要求我们为了得到正确的 offset 值必须进行除 2 的操作。
与 UIKit 使用的命令式导航方式不同,SwiftUI 作为一个声明式框架,感知与设置两者之间是二位一体的关系。读取状态即可获知当前的导航位置,更改状态便可调整导航路径。...我们可以将 NavigationSplitView 视为具备一些预置能力的 HStack,通过在其中声明两个或三个视图从而创建两列或三列的导航界面。...的视觉状态对于一些简单的两列或三列的导航布局,SwiftUI 可以自动将其转换成 NavigationStack 表现形式。...那么能否在导航列中使用 VStack 或 LazyVStack 实现程序化导航呢?...总结可以在 此处[5] 获取本文的全部代码。一次编写便可对应多种设备,这本就是 SwiftUI 的一个重要特点。尽管仍存在一些不足,但新的导航机制已经在这一方面取得了长足的进步。
将可滚动容器内的所有子视图视为一个整体,并为其添加 margin。之前在 List 或 TextEditor 中实现类似操作是十分困难的。...应将此修饰符应用于 ScrollView 中包含主要重复内容的布局容器,如 LazyHStack 或 VStack。...可采用 优化在 SwiftUI List 中显示大数据集的响应效率[5] 一文中介绍的方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定的位置。...(视图标识) 不支持锚点设定,固定锚点为子视图的 center 正如 优化在 SwiftUI List 中显示大数据集的响应效率[6] 一文所提到的,当数据集很大时,也会出现性能问题。...欢迎你通过 Twitter[8]、 Discord 频道[9] 或博客的留言板与我进行交流。 订阅下方的 邮件列表[10],可以及时获得每周最新文章。
是否有任何建议用来检测列表中的行选择,类似于 “NavigationLink”,但不导航到另一个视图(例如,显示 Sheet 或从列表中选择一个选项 )?...这也是 Redux-like 框架的优势之一( 将状态从视图中抽离出来,方便测试 )。...阅读 SwiftUI 的动画机制[8] 一文,了解更多有关动画的内容。自适应高度 SheetQ:如何在 iOS16 中呈现与动态内容高度相匹配的 Sheet?...对于非惰性视图(如 LazyVStack ),一旦 hosting controller 的视图被初始化,onAppear 将被调用。...image-20221022135326560San Francisco 宽度风格Q:如何在 SwiftUI 中如何使用 SF 字体家族新增的三种宽度风格( Compressed、Condensed、Expanded
前一期内容|全部周报列表 原创 几个在 SwiftUI 中使用惰性容器的技巧和注意事项[2] [Fatbobman( 东坡肘子)](https://twitter.com/fatbobman "Fatbobman...( 东坡肘子 "Fatbobman( 东坡肘子)")") 在 SwiftUI 的框架中,惰性布局容器,如 List 和 LazyVStack,提供了一种高效展示大型数据集的方法。...这些容器的设计精妙,它们仅在必要时才动态地构建和加载视图,从而显著优化了应用的性能和内存使用效率。...自定义遵循 RandomAccessCollection 的实现 实现无限数据加载 id 修饰器对 List 懒加载机制的影响 在惰性容器中,SwiftUI 仅保留 ForEach 子视图最顶层的状态...尽管在日常应用开发中不经常需要用到全局 actor,但它们在某些特定场景下,如主线程渲染,显得格外有价值。
本文将介绍几种在 SwiftUI 中获取当前滚动状态的方法,每种方法都有各自的优势和局限性。...中,很多的视图控件是对 UIKit( AppKit )控件的二次包装。...在 SwiftUI 中,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey )。...对于 List、ScrollView + LazyVStack( LazyHStack )这类的组合,需要为每个子视图都添加一个 scrollSensor。...判断的准确度没有前两种方式高当可滚动组件中的内容出现了非滚动引起的尺寸或位置的变化( 例如 List 中某个视图的尺寸发生了动态变化 ),本方式会误判断为发生了滚动,但在视图的变化结束后,状态会马上恢复到滚动结束滚动开始后
本文将通过一个优化列表视图的案例,展现在 SwiftUI 中查找问题、解决问题的思路,其中也会对 SwiftUI 视图的显式标识、@FetchRequest 的动态设置、List 的运作机制等内容有所涉及...考虑到当前的卡顿出现在进入视图的时刻,我们可以将查找问题的关注点集中在如下几个方面: Core Data 的性能( IO 或 惰值填充 ) 列表视图的初始化或 body 求值 List 的效能 Core...标识( Identity )是 SwiftUI 在程序的多次更新中识别相同或不同元素的手段,是 SwiftUI 理解你 app 的关键。...在 SwiftUI 中为视图设置显式标识目前有两种方式: 在 ForEach 的构造方法中指定 由于 ForEach 中的视图数量是动态的且是在运行时生成的,因此需要在 ForEach 的构造方法中指定可用来标识子视图的...虽然我们已经找到了导致进入列表视图卡顿的原因,但如何在不影响效率的情况下通过 scrollTo 来实现到列表端点的滚动呢?
类 Redux 框架通常都建议开发者将整个 app 的状态合成到一个单一的结构实例中( State ,符合 Equatable 协议 ),视图通过观察状态的变化( 有些框架支持切片式的观察以改善性能 )...简单介绍一下我探索过程( 以 TCA 框架进行举例 ):在 Reducer 中获取并管理值数据在 task( 或 onAppear )中通过发送 Action 启动一个长期的 Effect ,创建一个...在视图中通过 WrappedID 获取到对应的 AnyConvertibleValueObservableObject 或值类型。...在下一篇文章中,我们将探讨如何在 SwiftUI 中安全地响应数据,如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。希望本文能够对你有所帮助。...同时也欢迎你通过 Twitter[10]、 Discord 频道[11] 或博客的留言板与我进行交流。订阅下方的 邮件列表[12],可以及时获得每周的 Tips 汇总。
无需更改代码便可以适应不同的框架( 纯 SwiftUI 驱动、TCA 或其他的 Redux 框架 )所有的视图均可以实现在不使用任何 Core Data 代码的情况下进行预览,并可对 Mock 数据进行动态响应...遗憾的是,托管对象对于以值类型为主的 SwiftUI 来说并不算友好,因此,不少开发者都会在视图中将托管对象实例转换成一个结构体实例以方便接下来的操作( 如何在 Xcode 下预览含有 Core Data...这个类型除了用于为 SwiftUI 的视图提供数据外,同时也会被用于为其他的数据流提供有效信息,例如,在类 Redux 框架中,通过 Action 为 Reducer 提供所需数据。...我们将介绍如何在视图从 Core Data 中获取数据的操作这一过程中实现与托管环境解耦,创建一个可以接受 Mock 数据的自定义 FetchRequest 类型。...同时也欢迎你通过 Twitter[6]、 Discord 频道[7] 或博客的留言板与我进行交流。订阅下方的 邮件列表[8],可以及时获得每周的 Tips 汇总。
如何在Xcode下预览含有Core Data元素的SwiftUI视图 从SwiftUI诞生之日起,预览(Canvas Preview )一直是个让开发者又爱又恨的功能。...结合两年来我在SwiftUI中使用Core Data的经验和教训,我们将在本文中探讨: •导致SwiftUI预览崩溃的部分原因•如何在之后的开发中避免类似的崩溃出现•如何在Xcode中安全可靠地预览含有...因此,通常不推荐在视图中直接获取或操作Core Data数据(非常简单的应用除外)。...SwiftUI通常采用Redux的开发模式,通过将获取到的Core Data数据转换成标准的Swift结构从而避免在视图中使用托管对象上下文或托管对象。...在重启应用或重启预览后,数据会恢复成Bundle中的原始数据集(有时在预览模式下数据不会立即复原,需在几次动态模式切换后才会恢复)。
在几年前通过 SwiftUI 改变了 UI 在其平台上的定义方式后,苹果正在迈出超越 Core Data 的第一步,即一个基于 ORM、严格绑定于 Objective-C 动态能力的持久化框架。...据苹果公司称,持久性对象会在需要时从持久化存储中获取并更新。 Bool、Int、String 等简单类型支持开箱可用,但更为复杂的类型则必须要符合 Codable 协议,才能于持久化类中使用。...此外,将 SwiftUI 视图接入持久化模型只需使用一个新的 @Query 属性。...与 @State 和 @Binding 的使用方式相类似,每次底层数据发生变化时,@Query 可确保视图的自动重新渲染。...为让开发者能更为轻松地迁移至 SwiftData,该框架支持在现有 Core Data 应用中的逐步采用,在苹果提供的演示项目中展示了如何在一个 Core Data 应用中仅部分使用 SwiftData
WWDC 2023 正在如火如荼地进行。苹果不仅带来了全新形态的硬件产品,还推出了几个相当震撼的新框架。本文将聊聊我对本届 WWDC 中 SwiftUI 5.0 和 SwiftData 的初步印象。...总之,当前制约动画或视觉效果的将不再是 SwiftUI 的能力,而是开发者的创意。...大幅改善了 ScrollView 的控制力 本次升级中,为 ScrollView 带来了新的动态滚动定位系统( 不依赖 ScrollViewReader 和显式的 id 声明)、一次性的定位系统( 在视图进入后...不过极为遗憾的是,苹果并没有充分的利用 Swift 的 @_backDeploy 功能,在 SwiftUI 5.0 中,仅有极少切不太重要的功能或类型实现了低版本的适配:topBarLeading: SwiftUI.ToolbarItemPlacement...欢迎你通过 Twitter[5]、 Discord 频道[6] 或博客的留言板与我进行交流。 订阅下方的 邮件列表[7],可以及时获得每周最新文章。
前言 List 可能是 SwiftUI 附带的内置视图中最常用的一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图”的用户界面。...元素绑定和自定义滑动操作 接下来,让我们看看如何将完全自定义的滑动操作添加到列表中。...为了演示这种情况,我们在 List 中嵌套一个 ForEach (因为在 SwiftUI 的中,列表变化一版都是由 ForEach 触发的,而不是由 List 触发的)。...可定制的分隔符 自从引入 SwiftUI 以来,开发者们有一个非常普遍的要求,提供一个 API ,用于隐藏或以其他自定义实现列表中每个 item 之间的默认分隔符。...item 上调用的,而不是在列表本身上调用,这为我们提供了很大的灵活性,可以根据想要构建的 UI 类型动态隐藏或显示每个分隔符。
@State @State 是 SwiftUI 中最常用的属性包装器之一,主要用于在视图内部管理私有数据。它特别适合存储值类型数据,如字符串、整数、枚举或结构体实例。...需要动态切换实例的场景。比如在 NavigationSplitView 中,sidebar 中选择不同的实例,detail 视图动态更换数据源。...} } } 在视图中引入由外部框架或代码来保证存续期的 ObservableObject 实例时使用,例如引入 Core Data 的 NSManagedObject 实例。...它允许视图访问由 SwiftUI 或应用环境提供的数据、实例或方法。...典型应用场景 当需要访问和响应如界面样式(暗模式/亮模式)、设备方向、字体大小等由系统或上层视图提供的环境值时( 通常对应值类型)。
前言 WWDC 23 已经到来,SwiftUI 框架中有很多改变和新增的功能。在本文中将主要介绍 SwiftUI 中数据流、动画、ScrollView、搜索、新手势等功能的新变化。...Observation 框架为我们提供了 Observable 协议,必须使用它来允许 SwiftUI 订阅更改并更新视图。...在之前的 SwiftUI 框架版本中,应该使用 @ObservedObject 属性包装器来订阅更改。现在不需要了,因为 SwiftUI 视图会自动跟踪符合 Observable 协议的类型的更改。...动画 动画始终是 SwiftUI 框架中最重要的部分。在 SwiftUI 中轻松实现任何动画,但之前的框架版本缺少一些现在具有的功能。...,允许调整列表中的间距。
前言 SwiftUI 的各种堆栈是许多框架中最基本的布局工具,能够让我们定义组视图,这些组视图可以按照水平、垂直或覆盖视图对齐。...相反,让我们像 SwiftUI 一样,对这些属性参数化,同时设定框架所使用的默认值 — 就像这样: struct DynamicStack: View { var...然而,就像上面的代码展示的那样,使用 GeometeryReader 来展示动态切换有一个相当明显的缺点,在几何图形阅读器中总是会填充水平和垂直方向的所有可用空间(以便测量实际空间)。...Xcode 14 的一部分仍在测试阶段) 其中一个工具是新的 Layout 协议,它既能让我们创建完整的自定义布局,直接集成到 SwiftUI 的布局系统中,同时也提供给我们一种更丝滑更动画的方式在各种布局之间动态切换...就像字面意思一样,这种新的容器将会在我们初始化时传递的候选列表中,基于当前上下文挑选出最优视图。
它用于指定某个方法作为另一个方法的动态替代方法。在衍生代码中,Xcode 使用 @_dynamicReplacement 为多个函数提供了替代方法。...通过 XPC 在预览进程与 Xcode 之间进行通信,最终实现了在 Xcode 中预览特定视图的目的。...预览的工作流程 我们对上面的探索过程进行一个梳理,大致上可以得到如下的工作流程: Xcode 生成预览衍生代码文件 Xcode 编译整个项目,解析文件、获取预览视图实现、准备依赖的其他资源 Xcode...编译预览衍生代码文件,创建动态库 Xcode 启动预览线程,在其中加载 _XCPreviewKit 框架和预览衍生文件生成的 dylib XCPreviewKit 框架在预览线程中创建预览窗口 Xcode...欢迎你通过 Twitter[6]、 Discord 频道[7] 或博客的留言板与我进行交流。 订阅下方的 邮件列表[8],可以及时获得每周最新文章。
在SwiftUI中使用UIKit视图 如想获得更好的阅读体验可以访问我的博客www.fatbobman.com,或点击下方的阅读原文 已迈入第三个年头的SwiftUI相较诞生初始已经提供了更多的原生功能...在相当长的时间中开发者仍需在SwiftUI中依赖UIKit(AppKit)代码。好在,SwiftUI为开发者提供了便捷的方式将UIKit(AppKit)视图(或控制器)包装成SwiftUI视图。...本文将通过对UITextField的包装来讲解以下几点: •如何在SwiftUI中使用UIKit视图•如何让你的UIKit包装视图具有SwiftUI风格•在SwiftUI使用UIKit视图需要注意的地方...•同SwiftUI框架保持沟通上文中,我们提到UIViewRepresentable作为原始类型,需要主动承担更多的同SwiftUI框架或其他视图之间的沟通工作。...在协调器中,我们可以通过双向绑定(Binding),通知中心(notificationCenter)或其他例如Redux模式的单项数据流等方式,将UIKit视图内部的状态报告给SwiftUI框架或其他需要的模块
领取专属 10元无门槛券
手把手带您无忧上云