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

将SwiftUI drawingGroup()方法应用于使用ForEach生成的视图时,该方法似乎存在错误

SwiftUI中的drawingGroup()方法用于将视图的绘制内容缓存为位图,以提高性能。然而,在使用ForEach生成的视图中应用drawingGroup()方法时,可能会遇到一些问题。

错误的原因可能是由于ForEach生成的视图具有动态性,而drawingGroup()方法在处理动态视图时可能会出现错误。这可能导致绘制内容不正确或无法更新。

为了解决这个问题,可以尝试以下几种方法:

  1. 将drawingGroup()方法应用于ForEach之前的父视图,而不是ForEach生成的视图本身。这样可以确保整个ForEach视图都被缓存为位图,而不仅仅是单个子视图。
  2. 尝试使用其他方法来优化性能,例如使用List或LazyVStack来生成动态视图,这些方法在处理大量数据时通常更高效。
  3. 如果可能的话,尝试减少视图的复杂性,以降低绘制的工作量。可以考虑将视图拆分为更小的组件,以便更好地利用drawingGroup()方法的优势。

总之,尽管SwiftUI的drawingGroup()方法在大多数情况下都能正常工作,但在使用ForEach生成的视图时可能会遇到一些问题。通过将drawingGroup()方法应用于适当的父视图,使用其他性能优化方法或简化视图的复杂性,可以解决这些问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SwiftUI 动画机制

阅读本文前,读者最好已拥有在 SwiftUI使用动画编程经历,或对 SwiftUI 动画基本使用方法有一定了解。可以在 此处获取本文全部代码[2] SwiftUI 动画是什么?...在 SwiftUI 中,我们不能命令某个视图从一个位置移动到另一个位置,为了实现上述效果,我们需要声明视图在状态 A 所处位置以及状态 B 所处位置,当由状态由 A 转到 B SwiftUI...关联方式有:视图修饰符 animation 或全局函数 withAnimation 。 SwiftUI 动画异常(与开发者预期不符)很多情况下均与错误关联方式、错误关联位置等因素有关。...比如,在出场动画进行中状态 show 恢复成 true ,SwiftUI 将会保留当前分支状态(不会重新创建视图,参见本文附带范例)。...因此有很大可能因为对视图识别错误,而产生动画异常。下面的动图中,当出现相同元素SwiftUI 给出了警告提示。

14.6K40

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

A:当在其他类型 UIViewControllers 中使用 UIHostingController ,你可能会通过调用托管控制器方法来触发视图加载提前发生。...对我来说,这似乎是一个完全合理实现。如果你遇到了性能问题或者希望大幅扩展你所绘制图片数量,可以试一下 .drawingGroup 和 Canvas APIs ,它们都可以用于更密集地绘制。...除了使用习惯外,还应考虑偏移后视图是否需要会对周边视图产生影响( 布局层面 )。详情请阅读 在 SwiftUI 中实现视图居中若干种方法[14] 。...但是从一个文本字段到下一个文本字段聚焦感觉不够流畅,而且每当我在一个文本字段中输入一个字母,我 CPU 使用似乎会飙升到 70% — 100%。...这种方法唯一问题是,当我添加新数据,内存使用量增加。A:@EnvironmentObject / environmentObject 可能是跨视图层次共享同一模型最佳工具。

12.2K20

高级 SwiftUI 动画 — Part 1:Paths

当给一个视图制作动画SwiftUI 实际上是多次重新生成视图,并且每次都修改动画参数。这样,它就会从原点值渐渐走向最终值。 假设我们为一个视图不透明度创建一个线性动画。...框架多次重新生成视图,以小幅度增量来改变不透明度。...SwiftUI 已经为不透明度制作了动画,而不需要我担心这一切。是的,这是真的,但只要 SwiftUI 知道如何数值从原点插值到终点。对于不透明度,这是一个直接过程,SwiftUI 知道怎么做。...你只需要添加 .drawingGroup() 修饰符: FlowerView().drawingGroup() 根据 WWDC 2019, Session 237(用SwiftUI构建自定义视图):绘图组是一种特殊渲染方式...它将打开改变我们视图和动画方法大门。与 Paths 一样,SwiftUI 没有关于如何在两个不同变换矩阵之间转换内置知识。GeometryEffect将有助于我们这样做。

3.7K20

SwiftUI 与 Core Data —— 数据获取

本文中我们探讨在 SwiftUI 视图中批量获取 Core Data 数据方式,并尝试创建一个可以使用 mock 数据 FetchRequest。...这将有两个作用:数据变化后引发与其绑定视图进行更新由于底层数据并不保存在视图中,因此在视图存续期中 SwiftUI 可以随时创建新视图描述实例而无需担心数据丢失虽然苹果没有公开 _makeProperty...当 SwiftUI视图存续期中重新创建视图描述实例,自定义类型也一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议 Struct...类型中可引发视图更新数据发生变化后调用方法。...这是由于一旦 SwiftUI 惰性容器中出现了多个 ForEach ,惰性容器丧失对子视图优化能力。任何数据变动,惰性容器都将对所有的子视图进行更新而不是仅更新可见部分视图

4.6K30

onAppear 调用时机

假设排除了苹果起名出现了错误这个原因,此时 appear 更像是针对 SwiftUI 系统来说。...,在父视图询问其需求尺寸通过控制台报告给我们。...通过 UIViewControllerRepresentable 封装视图”并非真正视图,对于 SwiftUI 来说,它就是一块给出了需求尺寸黑洞,因此并不存在求值一说。...第一段代码对 VStack 进行求值计算到 Text ,创建 Text 实例创建实例,需要调用 getWord 来获取参数此时由于 newWords 数组为空,因此出现数组越界错误也就是说,在第一段代码报错...,此时 newWords 已经有值了,ForEach 正常处理所有的子视图总结在本文中,我们通过 SwiftUI 4 提供新工具明确了 onAppear 调用时机,或许这是新 API 开发未曾想到功能应用

2K20

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

前言 List 可能是 SwiftUI 附带内置视图中最常用一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图用户界面。...作为起点,假设我们正在处理以下 ArticleList 视图视图使用 ArticleListViewModel 来呈现文章列表: struct ArticleList: View { @ObservedObject...,可以让我们开发更加方便,阅读感觉更加自然。...由于每个 article 值在 ForEach 闭包中都是可变,我们可以使用 swipeActions 修饰符来实现每个 NavigationLink 项目视图自定义滑动操作。...在列表中使用 refreshable 修饰符就可以完成,然后使用修饰符闭包 await 调用视图模型异步 reload 方法: struct ArticleList: View { @ObservedObject

4.8K41

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

快速检索数组元素Q:为什么没有简单方法 TABLE 选择行映射到提供表内容数组元素上?似乎唯一方法是在数组中搜索匹配 id 值,这对于大表来说似乎效率很低。....}// 可以用类似字典方式对元素进行操作,快速定位,同时在更新 IdentifiedArray ,也不容易引发 ForEach 异常todos[id:id] = newTodo自定义布局Q:在实现自定义布局...macOS APIQ:对于运行 Monterey Mac,能否如何在 SwiftUI 中实现下面需求建议:打开一个窗口在窗口中初始化数据找到所有打开窗口确定一个窗口是否打开从不在窗口视图中关闭一个窗口...视图功能分散到函数、更小视图结构以及视图修饰器当中是很好解决方法。...然而,两个内容相同视图之间交换并不能使视图顺利地产生动画,因为两者文本也被动画化了。我正在使用仅禁用 TextField 替代方法,但有没有办法引导动画以使用文档中方法

14.7K30

SwiftUI 与 Core Data —— 安全地响应数据

本文介绍可能在视图中产生严重错误原因,如何避免,以及在保证视图对数据变化实时响应前提下如何为使用者提供更好、更准确信息。由于本文会涉及大量前文中介绍技巧和方法,因此最好一并阅读。...从另一个角度来看,即使在托管上下文中使用 delete 方法删除实例在数据库中对应数据,但如果托管对象实例仍被代码或视图所引用,Swift 并不会销毁实例,此时,托管对象上下文会将该实例 managedObjectContext...并没有出现崩溃情况。难道我们上面的论述都是错误?由于在 Core Data 模版代码中,只使用了一行代码来声明次级视图:Text("Item at \(item.timestamp!...任何可能脱离视图传递过程都应使用托管对象实例对应值类型版本。在更改数据进行二次确认为了避免对主线程造成过多影响,我们通常会在私有上下文中进行会对数据产生变化操作。...操作方法参数设置为值类型,迫使开发者在对数据进行操作( 添加、删除、更改等 )首先需要确认对应数据( 数据库中 )是否存在

3.2K20

构建稳定预览视图 —— SwiftUI 预览工作原理

image-20230522110636690 你会发现预览无法正常使用错误提示为: image-20230522110719469 我们再次查找当前项目 Derived Data 目录下尾缀为 ....在衍生代码中,Xcode 使用 @_dynamicReplacement 为多个函数提供了替代方法。在预览,以替代后 __preview__previews 方法作为预览入口。...了解了问题所在,我们还可以使用其他两种方式来解决之前代码无法在预览中使用问题。 方法 Item 从 ContentView 中移出来,放置到与 ContentView 同级代码位置。...在方法中,大概率进行了定义预览相关环境设置、设置预览初始状态等操作。最后,再创建了几个专门用于预览进程。...开发者使用预览需要清醒地认识到其局限性,并避免在预览中实现超出其能力范围功能。 接下来 在本文中,我们探讨了 Xcode 预览功能实现原理,并指出其存在一定局限性。

47710

SwiftUI 布局 —— 尺寸( 上 )

在 Layout 协议中,对应是 sizeThatFits 方法。经过阶段协商,SwiftUI 确定视图所在屏幕上位置和尺寸。...第二阶段 —— 安置子民 在阶段,父视图根据 SwiftUI 布局系统提供屏幕区域( 由第一阶段计算得出 )为子视图设置渲染位置和尺寸( 上方 5-6 )。...当父视图想获得子视图在最大模式下需求尺寸,会为其提供模式建议尺寸 明确尺寸模式 非 0 或 infinity 数值。...为子视图提供不同建议模式目的是获得在模式下子视图需求尺寸,具体使用哪种模式,完全取决于父视图行为设定。...渲染尺寸 在布局第二阶段,当 SwiftUI 布局系统调用布局容器( 符合 Layout 协议 ) placeSubviews 方法,布局容器会将每个子视图放置在给定屏幕区域( 尺寸通常与布局容器需求尺寸一致

4.7K20

避免 SwiftUI 视图重复计算

通过 _makeProperty 方法SwiftUI 得以实现在视图加载到视图,把所需数据( 值、方法、引用等 )保存在 SwiftUI 托管数据池中,并在属性图( AttributeGraph...)中将视图 Source of Truth 关联起来,让视图响应其变化( 当 SwiftUI 数据池中数据给出变化信号,更新视图 )。...当 SwiftUI 视图加载到视图,通过调用 _makeProperty 完成数据保存到托管数据池以及在属性图中创建关联操作,并将数据在托管数据池中引用保存在 _location ( AnyLocation...当 SwiftUI 视图视图树上删除,会一并完成对 SwiftUI 数据池以及关联清理工作。如此,使用 State 包装变量,其存续期将与视图存续期保持完全一致。...store 实例属性或方法,但无论在任何场合,但只要实例 objectWillChange.send 方法被调用( 例如修改了使用 @Published 包装属性 ),所有与之相关联视图

9.2K81

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

首先创建一个假设性需求: 一个可以展示数万条记录视图 从上个视图进入视图不应有明显延迟 可以一键到达数据顶部或底部且没有响应延迟 响应迟钝列表视图 通常会考虑采用如下步骤以实现上面的要求:...在 SwiftUI 中为视图设置显式标识目前有两种方式: 在 ForEach 构造方法中指定 由于 ForEach视图数量是动态且是在运行时生成,因此需要在 ForEach 构造方法中指定可用来标识子视图...通过它,开发者可以使用任何符合 Hashable 协议值为视图设置显式标识。ScrollViewProxy scrollTo 方法就是通过值来找到对应视图。...当仅通过 ForEach 来指定显示标识,List 会对这些视图显示进行优化,仅在需要显示才会对其进行实例化。...使用了 id 修饰符相当于这些视图ForEach 中拆分出来,因此丧失了优化条件。 总之,当前在数据量较大情况下,应避免在 List 中对 ForEach 视图使用 id 修饰符。

9.1K20

只在视图 Body 中生存变量

SwiftUI 通过调用视图实例 body 属性来获取视图值。...但很少有人会在 body 中去使用 var 来定义变量,因为实在找不到使用 var 理由和意义。本文探讨在 SwiftUI 视图 body 中用 var 来创建变量意义和可能场景。...不过就和通过 let _ = print("update") 能够帮助我们了解视图动态一样,掌握了在 body 中通过 var 创建变量及应用方法,也将有助于开发者更好地理解 SwiftUI 视图求值逻辑并掌握其时机...为什么和想象不一样!起始点不是 0 ? 同我们不要去推断在一个视图存续期内,SwiftUI 会创建多少个视图实例一样,我们也不应假设,在渲染第一行数据之前,body 没有被调用过。...,让我们可以直接在结果生成器中使用惰性变量。

65410

GeometryReader :好东西还是坏东西?

GeometryReader 自 SwiftUI 诞生之初就存在,它在许多场景中扮演着重要角色。然而,从一开始就有开发者对其持负面态度,认为应尽量避免使用。...一个容器视图,根据其自身大小和坐标空间定义其内容。 严格来讲,我并不完全赞同上述描述。这并非因为存在事实上错误,而是这种表述可能会引起用户误解。...这种描述可以有效地避免几何信息主要应用于视图误解。...当前,GeometryReader 以一个布局容器形式存在,其布局规则如下: 它是一个多视图容器,其默认堆叠规则类似于 ZStack 视图建议尺寸( Proposed size )作为自身需求尺寸...请阅读 用 SwiftUI 方式进行布局[9] 和 在 SwiftUI 中实现视图居中若干种方法[10] 两篇文章,以了解面对同一个需求,SwiftUI 有多种布局手段。

48170

解析 SwiftUI 中两处由状态更新滞后引发严重 Bug

本文解析 SwiftUI 中两个由于未能贯彻响应式编程原则而导致严重错误,并提供相应解决方案。...原文发表在我博客 肘子Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定操作,会先更新视图,待视图变化完成后再修改与其对应状态。...通过手势取消 Sheet 后,快速右滑导航容器会导致应用锁死这是一个在 SwiftUI 所有版本中存在错误,你可以在众多论坛或聊天室里看到不少开发者都在寻找解决方法。...,左上角 Back 按钮消失,但视图并没有返回根视图图片如果我告诉你,上述情况正是由前文提到状态更新滞后所导致,那么你如何避免这个问题呢?...状态更新滞后不仅存在于本文介绍两个案例中,当开发者遇到类似情况,可以尝试采用状态更新优先开发策略进行修改。总结今年 SwiftUI 已经进入了第五个年头。

593110

SwiftUI 视图生命周期研究

当 State 发生变化后,SwiftUI生成一棵新视图值树(Source of truth 没有发生变化节点,不会重新计算,直接使用旧值),并同老视图值树进行比对,SwiftUI 将对其中有变化部分重新布局渲染...•在 SwiftUI 生成视图值树,当发现没有对应实例SwiftUI 会创建一个实例从而获取它 body 结果。...•在生成视图值树,即使已经有可以对应实例(实例并未销毁),SwiftUI 仍可能会创建一个新实例。...每个视图值都有对应标识符,视图值和标识符结合在一起代表屏幕上某一块视图。 在 Source of trueh 发生变化后,视图值也会随之发生变化,但由于标识符不变,则视图仍然存在。...在前文视图值树介绍中我们提到,当 SwiftUI 重建,如果树上某个节点(视图 Source of truth 没有发生变化,将不重新计算,直接使用旧值。

4.3K30

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

VIPER为这种情况提供了一种替代方案,可以与SwiftUI和Combine结合使用,帮助构建具有清晰架构应用程序,架构有效地分离了所需不同功能和职责,如用户界面、业务逻辑、数据存储和网络。...模型使用一个JSON文件来实现本地持久性,但是您可以使用一个远程后端来代替它,而不必修改任何ui级代码。这就是干净体系结构优点之一:当您更改一个部分(比如持久层),它与代码其他部分是隔离。...SwiftUI所有目标视图声明为当前视图一部分,并根据视图状态显示它们。...要将VIPER映射到SwiftUI视图现在负责显示/隐藏视图,路由router是一个目标视图生成器,presenter在它们之间进行协调。...当您将其放置在NavigationView中链接将成为一个按钮,destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图

17.4K10

深入了解 SwiftUI 5 中 ScrollView 新功能

默认 ContentMarginPlacement(.automatic)导致指示器与内容之间长度不一致。如果想保持长度一致,应使用.scrollContent。...可采用 优化在 SwiftUI List 中显示大数据集响应效率[5] 一文中介绍方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定位置。...仅适用于 ScrollView 当 ForEach数据源遵循 Identifiable 协议,无需显式使用 id 修饰符设置标识 与 scrollTargetLayout 配合使用,可以获取当前滚动位置...(视图标识) 不支持锚点设定,固定锚点为子视图 center 正如 优化在 SwiftUI List 中显示大数据集响应效率[6] 一文所提到,当数据集很大,也会出现性能问题。...当子视图滑入和滑出包含它滚动视图可视区域,scrollTransition 会对视图应用给定过渡动画,并在不同阶段之间平滑地过渡。

69020

如何在Xcode下预览含有Core Data元素SwiftUI视图

在预览含有Core Data元素视图崩溃出现次数会愈发频繁,在某种程度上可能已经影响了开发者在SwiftUI使用Core Data热情。...其他视图方法、声明等代码错误,都可能会导致你无法预览当前视图。 在排查视图预览崩溃原因时,一定不能只关注当前视图或临近视图代码,其他代码中错误可能才是罪魁祸首。...SwiftUI预设了大量同系统有关环境值,通过设置或响应这些数据,我们可以修改系统配置或读取系统信息。 SwiftUI视图采用树状结构组织,在任意节点视图上注入环境数据都将影响节点所有子视图。...对于当前视图环境注入,必须在其祖先视图中完成。 如果视图中声明了对某个环境数据依赖,而忘记在其祖先视图中注入,并不会导致编译错误。应用程序在运行至视图时会直接崩溃。...尽管SwiftUIRedux模式有诸多优点,但由于只存在视图这一种表现形式,因此在视图描述中经常会参杂不少数据计算、整理工作。

5.1K10
领券