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

为什么在SwiftUI中LazyHStack可以全高运行,而HStack则不能?

在SwiftUI中,LazyHStackHStack的主要区别在于布局计算和渲染的性能优化。

基础概念

  • HStack: 是一个水平堆栈布局容器,它会立即计算并渲染其所有子视图,无论这些子视图是否在当前视图中可见。
  • LazyHStack: 是HStack的一个变体,它只在需要时才计算和渲染其子视图,这通常用于优化性能,特别是在处理大量子视图时。

为什么LazyHStack可以全高运行,而HStack则不能?

LazyHStack能够全高运行的原因在于它的懒加载特性。当你将一个LazyHStack放置在一个垂直堆栈(如VStack)中,并且希望它能够扩展以填充整个可用高度时,LazyHStack会根据其父视图的高度要求来调整自身的高度。由于LazyHStack只在需要时渲染子视图,它可以更灵活地适应高度变化,因为它不会立即渲染所有子视图,这有助于它更好地管理布局和尺寸。

相比之下,HStack会立即渲染所有子视图,这可能导致它在处理高度自适应时遇到问题。如果HStack中的子视图没有足够的内容来填充整个高度,它可能不会扩展到父视图的全高。此外,由于HStack立即渲染所有子视图,它在处理大量数据时可能会导致性能问题。

应用场景

  • LazyHStack: 适用于需要显示大量子视图,但只想在用户滚动到它们时才渲染它们的场景。例如,在一个长列表中,你可能只想渲染当前屏幕上可见的项目。
  • HStack: 适用于简单的水平布局,其中子视图的数量不多,或者你需要立即显示所有子视图的场景。

解决问题的方法

如果你希望HStack能够全高运行,你可以尝试以下方法:

  1. 确保子视图能够扩展: 确保HStack中的子视图能够根据需要扩展以填充可用空间。你可以使用.frame(maxHeight: .infinity)来让子视图尝试扩展到最大高度。
代码语言:txt
复制
VStack {
    HStack {
        ForEach(0..<10, id: \.self) { index in
            Text("Item \(index)")
                .frame(maxHeight: .infinity)
                .background(Color.gray.opacity(0.2))
        }
    }
    .frame(maxHeight: .infinity)
    .background(Color.blue.opacity(0.2))
}
  1. 使用GeometryReader: 使用GeometryReader来获取父视图的尺寸,并据此调整子视图的布局。
代码语言:txt
复制
VStack {
    GeometryReader { geometry in
        HStack {
            ForEach(0..<10, id: \.self) { index in
                Text("Item \(index)")
                    .frame(maxHeight: geometry.size.height)
                    .background(Color.gray.opacity(0.2))
            }
        }
    }
    .frame(maxHeight: .infinity)
    .background(Color.blue.opacity(0.2))
}

通过这些方法,你可以使HStack更好地适应高度变化,尽管它可能不如LazyHStack在性能优化方面那样高效。

参考链接

SwiftUI LazyHStack and HStack

相关搜索:为什么python模块可以在shell中运行,而不能在脚本中运行?为什么Popen('ping URL').communicate()可以在Windows下运行,而不能在Ubuntu中运行?为什么setMenu(null)可以在Windows上运行,而不能在Linux上运行?为什么我在Squarespace中的动画可以在Chrome上运行,而不能在Safari上运行?为什么我在Haskell中的代码可以在命令行上运行,而不能在文件中运行为什么PHP setcookie可以在本地主机上运行,而不能在浏览器中运行?为什么这个css可以在demo上运行,而不能在我的项目中运行?为什么macOS中的SwiftUI多行换行文字可以在预览中使用,而不能在真实应用中使用?为什么我的代码可以在某些站点上运行,但在NetBeans中不能运行?为什么Angular (5) HostListener事件可以在Chrome中运行,但IE不能?为什么getCurrentInterruptionFilter BroadcastReceiver可以在快速设置中工作,而不能在设置中工作?为什么在make文件中可以链接.cc文件而不能链接.c文件?为什么我的angular函数可以在Android和Windows中运行,但不能在iOS中运行?为什么haskell gnuplot代码可以在ghci中运行,但在编译后不能在CLI中运行?为什么我的Post api可以在postman中运行,但不能在react原生应用中运行为什么我不能在Node中运行这个MongoDB查询,但它可以在社区compass中运行?为什么hangfire仪表板可以在开发中工作,而不能在部署中工作为什么下面的正则表达式可以在cli上运行,而不能在bash-script上运行?在PHP中,为什么函数可以在定义之前调用,而变量不能在定义之前使用?为什么向函数发送**head可以在反转SLL时工作,而*head在C中不能?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SwiftUI 新容器视图 API 深度解析:轻松构建自定义布局

前言自 SwiftUI 的第一个版本发布以来,它就拥有了几种容器视图。最常用的有 HStack、VStack、List 等。...通过 Card 容器视图内嵌入不同的视图,你可以应用的多个屏幕复用它。这是使用容器视图的主要优势之一:你可以通过将共享的功能封装在容器视图中,应用的不同地方重复使用它们。...想了解更多关于 @ViewBuilder 闭包的内容,可以查看我关于 “SwiftUI @ViewBuilder 的强大功能” 的文章。...你可以应用的多个地方使用该容器来保持一致的样式。Carousel:一个横向滚动的容器视图,可以自动排列并展示内容,适合展示横向滑动的图像或视图。...运行这个Demo此代码展示了如何在 SwiftUI 构建自定义的容器视图,灵活地将不同的布局封装在容器,以便在应用多次复用这些布局模式。

13111

深入了解 SwiftUI 5 ScrollView 的新功能

SwiftUI 5.0 ,苹果大幅强化了 ScrollView 功能。新增了大量新颖、完善的 API。本文将对这些新功能进行介绍,希望能够让它们更多、更早的帮助到有需要的开发者。...可采用 优化 SwiftUI List 显示大数据集的响应效率[5] 一文中介绍的方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定的位置。...(视图标识) 不支持锚点设定,固定锚点为子视图的 center 正如 优化 SwiftUI List 显示大数据集的响应效率[6] 一文所提到的,当数据集很大时,也会出现性能问题。...总结 我完全没有想到, SwiftUI 5 ,苹果对 ScrollView 进行了全面增强。值得赞赏的是,他们不仅提供了一些一直期待的功能,而且 API 的设计和实现完成度上都非常出色。...就我个人而言, SwiftUI 5 ,ScrollView 的原生方案已经能够满足大多数需求,因此我们将看到更多人采用 ScrollView + LazyStack 的组合方式。

83620
  • SwiftUI 布局协议 - Part 1

    简介 今年 SwiftUI 新增最好的功能之一必须是布局协议。它不但让我们参与到布局过程,而且也给了我们一个很好的机会去更好的理解布局 SwiftUI 的作用。...这是可以的,尽管我仍然推荐你浏览第一部分,至少浅读一下。这将确保我们开始探索第二部分描述的更多高级特性时,我们同一进度。...请注意至少到现在,布局协议不能创建懒加载容器,比如 LazyHStack 或 LazyVStack。懒加载容器是指那些只滚入屏幕时渲染,滚出到屏幕外就停止渲染的视图。...但是不用担心,目前为止你可以认为它们就是视图并且像视图一样使用它们。这个框架使用了漂亮的 Swift 语言技巧使你的布局代码SwiftUI 插入时产生一个透明视图 。...这些信息都可以大大的简化任务。即使你不能有这种奢望来做这种假设,它也可能是开始编码的好地方,让你的布局一些情况下工作,然后开始为更复杂的情况添加代码。

    3.3K10

    如何判断 ScrollView、List 是否正在滚动

    本文将介绍几种 SwiftUI 获取当前滚动状态的方法,每种方法都有各自的优势和局限性。...isScrolling_2022-09-12_10.26.06.2022-09-12 10_28_09方法一:Introspect可在 此处[4] 获取本节的代码 UIKit( AppKit ),开发者可以通过...目前 SwiftUI 在内部的实现上去 UIKit( AppKit )化很明显,比如,本节介绍的方法 SwiftUI 4.0 已经失效方法二:Runloop我第一次接触 Runloop 是在学习 Combine...模式,因此无法有效地区分滚动是由那个控件造成的方法三:PreferenceKey SwiftUI ,子视图可以通过 preference 视图修饰器向其祖先视图传递信息( PreferenceKey...判断的准确度没有前两种方式当可滚动组件的内容出现了非滚动引起的尺寸或位置的变化( 例如 List 某个视图的尺寸发生了动态变化 ),本方式会误判断为发生了滚动,但在视图的变化结束后,状态会马上恢复到滚动结束滚动开始后

    3.8K40

    SwiftUI 实现视图居中的若干种方法

    SwiftUI ,有很多手段可以达成此目的。本文将介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。...当然,你也可以利用 Spacer 这个特性,控制 Text HStack 可使用的宽度。...HStack、VStack 进行布局时,会为每个子视图提供四种不同的建议模式( 最小、最大、明确尺寸以及未指定 ),如果子视图不同的模式下返回的需求尺寸是不一样的,意味着该视图是可变尺寸视图。...因此第一个例子,即使没有为 HStack 设置 spacing ,Text 仍然会使用全部的 HStack 宽度。...().fill(.clear)使用 SwiftUI 进行开发的过程,Color、Rectangle 等经常被用来实现对容器的等分操作。

    6.8K40

    自定义 SwiftUI 符号图像的外观

    如果我们 foregroundStyle() 修饰符应用多个样式,调色板模式将自动激活。...可变值 SwiftUI 显示符号图像时,我们可以提供一个 0.0 到 1.0 之间的可选值,渲染的图像可以使用它来自定义外观。如果符号不支持可变值,此参数无效。...斜杠变体可以表示项目或操作不可用,填充变体可以表示选择。 SwiftUI ,我们可以使用 symbolVariant() 修饰符来应用这些变体。...许多情况下,显示符号的视图会自动选择合适的变体。例如,iOS 标签栏通常使用填充变体,导航栏偏好轮廓变体。这种自动选择确保符号不同上下文中有效使用,而无需明确指定。...将上述代码粘贴到 ContentView.swift 文件运行项目,查看效果。结论SwiftUI增强符号图像可以显著改善应用程序的外观和感觉。

    10910

    为什么SwiftUI的视图使用结构体?

    我之所以说性能因素,是因为很多人认为这是SwiftUI使用结构体的主要原因,实际上这只是更大范围的一部分。...UIKit,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现到其中的图层等等。...struct or class 通常这不是问题,但是有一个名为UIStackView的特定子类,它类似于SwiftUI的VStack和HStack。...SwiftUI,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,结构体的整个大小就是:一个整数。没有其他的。...通过生成不会随时间变化的视图,SwiftUI鼓励我们转向更具功能性的设计方法:将数据转换为UI时,我们的视图变成简单的,惰性的东西,不是会失去控制的智能化的东西。

    3.2K10

    面向所有人的 UI 编程 :透过点按弹窗初尝 SwiftUI

    本文是 SwiftUI 开发教程的一篇,我们将一起探究上述问题的答案。若你有兴趣学习 iOS 应用程序开发,又或者是想了解 iOS 程序是如何运行的,欢迎关注这一系列文章。...SwiftUI 集众家之长,具有诸多优秀特性,可以预见它将会出现在诸多应用程序。若你有兴趣,我会在其它文章详解 SwiftUI,本文只着重讲其中弹窗的写法与逻辑。 你会怎样描述一个程序?...SwiftUI 由两类代码组成,分别是 View 和 Modifier。如下图所示,这两类代码都可以 Xcode 中直接拖出来用,你要做的只是玩拼图把它们拼在一起拼出你想要的功能。...纵向排列的 View SwiftUI 里叫做 VStack,它用一个花括号 {包住里面的内容};文字的 View SwiftUI 里叫做 Text。...若你因为文中的长代码感到害怕,觉得程序员都是天才,脑子超好用能将这些代码一次性写出来,不是这样的。比如上面代码的例子,一开始你只有一个简单的思路,我要一句名言,能点按复制就行。

    2.1K40

    SwiftUI 布局 —— 对齐

    欢迎大家 Discord 频道[2] 中进行更多地交流 “对齐”是 SwiftUI 中极为重要的概念,然而相当多的开发者并不能很好地驾驭这个布局利器。...,还可以标识线 SwiftUI ,分别用 HorizontalAlignment 和 VerticalAlignment 来标识视图纵轴和横轴方向的参考线,并且可以由两者共同构成对视图中的某个具体的参考点的标识...alignmentGuide 修饰器 SwiftUI ,开发者可以使用 alignmentGuide 修饰器来修改视图某个对齐指南的值( 为对齐指南设定显式值,有关显式值见下文)。...文字基线不同于 bottom Text("山不在,有仙名。水不在深,有龙灵。斯是陋室,惟吾德馨。苔痕上阶绿,草色入帘青。谈笑有鸿儒,往来无白丁。可以调素琴,阅金经。无丝竹之乱耳,无案牍之劳形。...overlay、background SwiftUI ,除了我们熟悉的 VStack、HStack、ZStack 、Grid 、List 外,很多 modifier 的功能也都是通过布局来实现的。

    6.4K20

    使用 SwiftUI 创建一个灵活的选择器

    前言 最近,我正在开发一个 Dribbble 上找到的设计的 SwiftUI 实现时,我想到了一个点子,可以通过一些酷炫的筛选器扩展该项目以缩小结果列表。...(不能适应上一行的元素),并通过减去当前项的宽度来更新 HStack 的行宽。...这就是为什么我将分隔行的结果映射到元组,其中包含每行和 UUID 值。 由于如此,我可以向 ForEach 循环提供 id 参数。...这就是为什么我首先将整个 ForEach 循环包装在 HStack ,然后再包装在 Group ,以确保编译器可以正确解释一切。...最后,提供了一个简单的视图实现,可以 SwiftUI 中使用该选择器。这个选择器可用于创建各种交互式选择界面。 - EOF -

    29720

    如何在 SwiftUI 开发定制 MapKit 功能

    默认情况下,SwiftUI 激活所有可用手势,但你可以轻松将可用交互限制为首选交互的列表。...mapControls 视图修饰符一起使用,为 SwiftUI 视图层次结构中共享相同环境的任何地图实例指定控件。...当你将 MapScaleView 或 MapCompass 视图放在 mapControls 视图修饰符内时,SwiftUI 会处理控件的放置,具体取决于运行应用的平台。...这些地图控件是简单的 SwiftUI 视图,这意味着你可以 mapControls 视图修饰符之外的任何位置使用它们。...其次,我们了解了预定义和可配置的地图样式,例如 standard 样式允许配置地图的高程、感兴趣点和是否显示交通信息, hybrid 样式允许同时显示影像、道路和道路名称。

    15521

    为什么 SwiftUI 的视图使用结构体

    我之所以说性能因素,是因为很多人认为这是 SwiftUI 使用结构体的主要原因,实际上这只是更大范围的一部分。...struct or class 通常这不是问题,但是有一个名为 UIStackView 的特定子类,它类似于 SwiftUI 的 VStack 和 HStack。... UIKit ,UIStackView 是一种非渲染视图类型,旨在简化布局,但这意味着即使它因为继承的原因具有背景色,也从未真正使用过。... SwiftUI ,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,结构体的整个大小就是:一个整数。没有其他的。...通过生成不会随时间变化的视图,SwiftUI 鼓励我们转向更具功能性的设计方法:将数据转换为 UI 时,我们的视图变成简单的,惰性的东西,不是会失去控制的智能化的东西。

    2.4K50

    使用 SwiftUI 的 Eager Grids

    介绍 早在 2020 年,我们就拥有了 SwiftUI(LazyVGrid 和 LazyHGrid)绘制网格的新视图控件。两年后,我们又获得了另一种在网格(Grid)显示视图的视图控件。...尽管这里的大多数示例都可以,但每一行可以包含任意数量的单元格。 探索网格选项 以下部分,我们将探讨不同的网格大小、对齐和跨越选项。...请注意,虽然我设计应用程序时主要考虑了 macOS,但该应用程序 iPad 上也能流畅运行。无需更改。 当您阅读以下部分时,最好运行 Grid Trainer 应用程序并测试您对网格的理解。...在下面的示例,橙色列的宽度由第二行中最宽的单元格决定。身高也是如此。示例,第二行与行中最高的紫色单元格一样。 未定义大小的单元 默认情况下,网格将为单元格提供尽可能多的空间。...如果您查看第一行的第二个单元格,它应该跨越到以下列。但是第二行的以下列应该扩展到第三列。那是什么?我们可以满足一个条件或另一个条件,但不能同时满足这两个条件。

    4.4K20

    SwiftUI 布局协议 - Part2

    为什么我们不让半径也可以动画呢?...避免布局循环和崩溃 众所周知我们布局期间不能更新视图状态。这会导致不可预测的结果,很可能会使 CPU 达到峰值。在此之前我们看到过这种情况,即闭包在布局期间运行时,也许当时不是太明显。...这是个老问题,我 SwiftUI 刚发布的时候就写过此类问题, Safely Updating The View State [1] 一文可以查看更多信息。 我还想再提一下潜在的崩溃。...这是可以实现的,因为缓存是一个 inout 参数,我们可以 placeSubviews 更新。...我经常认为这些视图是理所当然的,并将它们视为简单不复杂的容器,好吧,尝试编写自己的版本,各种情况下复制一个 HStack ,多种类型的视图和布局优先级竞争同一个空间。。。这是一个不错的挑战!

    2.7K30

    如何在 Swift 取消一个后台任务

    该代码建立在在 Swift 中使用 async let 并行的运行后台任务编写的AsyncLetApp之上。...为什么要取消一个后台任务 与视图的交互可能会触发后台任务的运行,进一步的交互可能会使最初的请求过时,并触发后续的后台任务运行。除了浪费资源外,不取消初始任务可能会导致你的应用程序出现偶现和意外行为。...一个取消按钮被添加到视图中,其点击事件是ViewModel调用取消方法。...使用取消标志 有多种方法可以取消后台任务的工作。...的子任务 SwiftUI 取消和恢复后台任务 结论 异步编程,重要的是停止任何不需要的后台任务以节省资源并避免后台任务干扰应用程序的任何不良副作用。

    2.8K30

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

    标识( Identity )是 SwiftUI 程序的多次更新识别相同或不同元素的手段,是 SwiftUI 理解你 app 的关键。... SwiftUI 应用代码,绝大多数的视图标识都是通过结构性标识 (有关结构性标识的内容可以参阅 ViewBuilder 研究(下) —— 从模仿中学习[4])来实现的 —— 通过视图层次结构(视图树... SwiftUI 为视图设置显式标识目前有两种方式: ForEach 的构造方法中指定 由于 ForEach 的视图数量是动态的且是在运行时生成的,因此需要在 ForEach 的构造方法中指定可用来标识子视图的...新的问题 细心的朋友应该可以注意到,运行解决方案一的代码后,第一次点击 bottom 按钮时,大概率会出现延迟情况(并不会立即开始滚动)。...scrollByUITableView_2022-04-23_19.44.26.2022-04-23 19_46_20 希望 SwiftUI 之后的版本能够改善上面的性能问题,这样就可以无需使用非原生方法也能达成好的效果

    9.2K20

    SwiftUI 布局 —— 尺寸( 上 )

    SwiftUI 的尺寸 如上文中所示, SwiftUI 的布局过程不同的阶段、出于不同的用途,尺寸这一概念是不断地变化的。...该自定义布局容器又会在它的 sizeThatFits 方法通过调用其子视图代理( Subviews,子视图 Layout 协议的表现方式 )的 sizeThatFits 方法为子视图代理提供建议尺寸...return cache.cropBounds.size } 根据建议尺寸内容的不同,我们可以将建议尺寸细分为四种建议模式, SwiftUI ,父视图会根据它的需求选择合适的建议模式提供给子视图...例如:ZStack 会将其父视图提供给它的建议模式直接转发给 ZStack 的子视图, VStack、HStack 则会要求子视图返回全部模式下的需求尺寸,以判断子视图是否为动态视图( 特定维度可以动态调整尺寸... SwiftUI ,通过设置或调整建议模式进行二次布局的场景很多,比较常用的有:frame、fixedSize 等。

    4.8K20

    TCA - SwiftUI 的救星?(一)

    自那时过了两年后, SwiftUI 的发布才让这套机制有了更加合适的舞台。 SwiftUI 发布初期,我也写过一本相关的书籍[3],里面使用了一些类似的想法,但是很不完善。...可以说,从 iOS 14 开始,SwiftUI 才算逐渐进入了可用的状态。最近随着公司的项目彻底抛弃 iOS 13,我也终于可以更多地正式在工作中用上 SwiftUI 了。...我们类比一下这些步骤 SwiftUI 的实现,可以发现步骤 4 其实已经包含在 SwiftUI 中了:当 @State 或 @ObservedObject 的 @Published 发生变化时,SwiftUI... SwiftUI ,body 的刷新是 SwiftUI 运行时通过 @ObservedObject 属性包装所提供的特性。现在这部分内容被包含在了 WithViewStore 。...虽然这需要我们自己去将 View 和 Model 绑定起来,会有些麻烦,但是如果你想要尽快尝试 TCA,却又不能使用 SwiftUI,也可以 UIKit 中进行学习。

    3.3K30
    领券