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

SwiftUI 布局协议 - Part 1

就像我在以前的文章 SwiftUI 中 frame 的表现 所描述的的那样,在布局过程中,视图给子视图提供一个尺寸,但最终还是由子视图决定如何绘制自己。然后,它将此传达给视图,以便采取相应的动作。...每个视图都有一个,作为视图的直接后代。尽管有这个名称,但它的类型不是视图,而是一个代理。我们可以查询这些代理去了解我们正在布局的各个视图的布局信息。...因为 sizeThatFits 和 placeSubviews 都可以为单个视图更改时多次调用,所以保留不需要为每次调用重新计算的数据缓存是有意义的。 使用缓存不是必须的。事实上,很多时候你不需要。...} 所以你明白了,布局类型并不是视图,但是当你在 SwiftUI 中使用它们的时候它们就会产生一个视图。...那是因为视图会识别标识并且维护, SwiftUI 这个行为认为是视图的改变,不是两个单独的视图

3.2K10

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

欢迎大家在 Discord 频道[2] 中进行更多地交流某个视图视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。...在 SwiftUI 中,有很多手段可以达成此目的。本文介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。...image-20220829152914736合成后的视图放置在某个可能会充满屏幕的视图的顶部或底部显示结果或者与你的预期不符 VStack { // Hello world 视图 1...)很遗憾,使用上面的代码,Text 只能使用 HStack 三分之一的宽度。...那么 HStack、VStack 会在明确了所有固定尺寸子视图的需求尺寸后,所剩的可用尺寸( HStack、VStack 的视图给他们的建议尺寸 - 固定尺寸子视图的需求尺寸 )平均分配( 在优先级相同的情况下

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

SwiftUI 布局 —— 对齐

比如书桌上的一摞书摆放整齐,列队训练时向左(右)看齐等等。在 SwiftUI 中,对齐是指在布局容器中,多个视图按照对齐指南( Alignment Guide )进行对齐。...因为这两个对齐指南会根据视图内容的不同变化。...VStack、HStack、ZStack 等支持多视图的布局容器 你是否了解 SwiftUI 常用布局容器构造方法中的对齐参数的含义?它们又是如何实现的呢?...摆放结束后,容器汇总摆放后的所有子视图的情况并向它的视图容器 )返回一个自身的需求尺寸。...总之,为 VStack、HStack、ZStack 这类可包含多个子视图的官方布局容器设置 alignment 的含义就只有一种 —— 在特定维度上,所有的子视图按照给定的对齐指南进行对齐摆放。

6.2K20

SwiftUI 布局 —— 尺寸( 上 )

欢迎大家在 Discord 频道[2] 中进行更多地交流 在 SwiftUI 中,尺寸这一布局中极为重要的概念,似乎变得有些神秘。无论是设置尺寸还是获取尺寸都不是那么地符合直觉。...经过该阶段的协商,SwiftUI 确定视图所在屏幕上的位置和尺寸。...第二阶段 —— 安置子民 在该阶段,视图根据 SwiftUI 布局系统提供的屏幕区域( 由第一阶段计算得出 )为子视图设置渲染的位置和尺寸( 上方的 5-6 )。...容器与视图 在阅读 SwiftUI 布局系列文章时,大家可能会对其中某些称谓产生困惑。一会儿视图、一会儿布局容器,到底它们之间是什么关系,是不是同一个东西?...例如:ZStack 会将其父视图提供给它的建议模式直接转发给 ZStack 的子视图 VStack、HStack 则会要求子视图返回全部模式下的需求尺寸,以判断子视图是否为动态视图( 在特定维度可以动态调整尺寸

4.6K20

SwiftUI 布局 —— 尺寸( 下 )

本篇中,我们通过对视图修饰器 frame 和 offset 的仿制进一步加深对 SwiftUI 布局机制的理解,并通过一些示例展示在布局时需要注意的问题。... overlay 和 background 的需求尺寸则完全取决于它们的主视图( 本例中,overlay 的需求尺寸由 ButtonView 决定,background 的需求尺寸由 HeartView...当用布局容器创建合成视图时,必须将构成后的合成视图容器的布局影响考虑到其中。针对不同的需求,选择恰当的容器。...面子和里子 与 UIKit 和 AppKit 类似,SwiftUI 的布局操作是在视图层面( 里子 )进行的,所有针对关联图层( backing layer )的操作仍是通过 Core Animation...可在 此处获取[4] 本文的仿制代码 frame SwiftUI 中有两个版本的 frame,本节我们仿制 frame(width: CGFloat?

2.5K40

掌握 ViewThatFits

ViewThatFits 视图给出的建议尺寸作为自己的建议尺寸传递给选择的子视图,并获得该子视图在明确建议尺寸下的需求尺寸。...(视图给它的建议尺寸)设置为 10。...ScrollView:如果理想状态的轴与滚动方向一致,则在滚动方向上一次性展示所有的子视图而无视视图的建议尺寸。 VStack、HStack、ZStack:所有子视图在理想状态下的整体呈现。...SwiftUI 提供了两个版本的 fixedSize ,我们当前使用的版本要求视图在水平和垂直两个轴向上都使用理想尺寸,另一个版本允许我们对单个轴向进行限定。...示例 所有的理论知识都是为实际应用服务的。在本节中,我们通过几个示例来展示 ViewThatFits 的功能。

14810

SwiftUI 布局协议 - Part2

开始的位置和结束的位置是一样的,因此就 SwiftUI 而言,没有动画。 如果这就是你要找的东西,那就太好了,但由于我们视图围绕一个圆圈放置,如果视图沿着那个假想的圆圈移动不是更有意义吗?...= nil } 注意:我称它为双向自定义值,因为信息是可以双向流动的,但是,这不是 SwiftUI 的官方术语,只是为了更清晰的解释这个想法的术语。...我们还可以添加一个改进,那就是视图旋转的动画。仔细观察并比较下面三个轮子:一个不旋转。另外两个旋转指向中心,但是一个不使用动画另一个使用。...在本例中,我创建了两个 UUID 布局值,一个标识视图,另一个作为视图的 ID。...我经常认为这些视图是理所当然的,并将它们视为简单不复杂的容器,好吧,尝试编写自己的版本,在各种情况下复制一个 HStack ,多种类型的视图和布局优先级竞争同一个空间。。。这是一个不错的挑战!

2.7K30

解析SwiftUI布局细节(二)循环轮播+复杂布局

GeometryReader 的主要作用就是能够获取到View建议的尺寸,这就是它的主要作用,要没有它我们面临的可能就是无休止的传值了,SwiftUI 既然是声明式的UI,按我的理解你就没有办法去获取某一个视图视图之类的...3、再提一点关于上面说的滚动视图,在UIKit中我们可以用UICollectionView搞定一切,但是在SwiftUI中没有这个控件,我建议采用的方式是 ScrollView + HStack + VStack...的方式去实现,很多同行有说目前来看SwiftUI的List在数据量大的情况下性能不是特别好,采用ScrollView是个不错的方式,而且也很容易构建出来,并不是说每一个Item的位置都需要你去计算,...HStack 这没啥可以具体说的,可以看代码,注释比较多,就不在这里累赘了。 Gesture 这个我们可以说说,它就是我们具体手势的类,像我们的单击手势和我们这里用到的拖拽手势一样。...这样基本上循环轮播的实现我们基本上都说清楚了,具体里面的一些实现细节代码注释写的清清楚楚,还是仔细看看代码结合里面的注释来看,难度不是很大。

11.7K20

GeometryReader :好东西还是坏东西?

几何信息传递到上层视图,可能会引起不必要的视图更新。向下传递信息,可以确保更新只在 GeometryReader 的闭包中进行。 GeometryReader 是布局容器吗,它的布局逻辑是什么?...当前,GeometryReader 以一个布局容器的形式存在,其布局规则如下: 它是一个多视图容器,其默认堆叠规则类似于 ZStack 视图的建议尺寸( Proposed size )作为自身的需求尺寸...( Required Size )返回给视图 视图的建议尺寸作为自身的建议尺寸传递给子视图 视图的原点(0,0)置于 GeometryReader 的原点位置 其理想尺寸( Ideal Size...为此,我们首先需要理解 SwiftUI 的布局原理。 SwiftUI 的布局是一个协商过程。视图向子视图提供建议尺寸,子视图返回需求尺寸。...视图是否根据子视图的需求尺寸来放置子视图,以及子视图是否根据视图给出的建议尺寸来返回需求尺寸,完全取决于视图和子视图的预设规则。

39970

SwiftUI中的水平条形图

SwiftUI中的水平条形图 水平条形图以矩形条的形式呈现数据类别,其宽度与它们所代表的数值成正比。本文展示了如何在垂直条形图的基础上创建一个水平柱状图。 水平条形图不是简单的垂直条形图的旋转。...在Numbers 等应用程序中,水平条形图被定义为独立的图表类型,不是垂直条形图。除了条形差异外,x轴和y轴的格式也需要不同。...Bar Chart with multiple data sets in SwiftUI SwiftUI 中的水平条形图 条形图转换为水平 水平条形图不仅仅是在垂直条形图上的配置,有一些元素是可以重复使用的...} } } } } ChartAreaHView与ChartAreaView几乎相同,只是Bars被放置在一个垂直的堆栈中,不是水平的堆栈...这可能是这些组件分解成更小的SwiftUI视图并通过组合来重用的原因。

4.7K20

SwiftUI-布局案例

介绍 import SwiftUI struct ContentView : View { var body: some View { Text("Hello World...视图为子视图提供预估尺寸。 子视图计算自己的实际尺寸。 视图根据子视图的尺寸视图放在自身的坐标系中。 最重要的是第 2 步,通常有 3 种设置尺寸的方式。...Stack2.png 复杂案例 第 1 步:堆栈计算出内部间距和边距,并将其从其父视图建议的大小中减去。 第 2 步:对于每个剩余视图,堆栈剩余空间分成相等的部分。...堆栈空间分成 3 个相等的部分,每个部分的宽度为 80。 80 这个尺寸推荐给最不灵活的孩子。案例中为 Image,其尺寸为 80x80。...堆栈再次空间分成 2 个相等的部分,每个部分的宽度为 80。 它建议第 1 个 Text 的大小为 65x120。Text 回应内容不适合,但它至少可以显示一部分内容。第 2 个文本视图也是如此。

9810

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

SwiftUI并非如此:我们更喜欢结构体用于整体视图,这有两个原因。 首先,有一个性能因素:结构体比类更简单,更快。...我之所以说性能因素,是因为很多人认为这是SwiftUI使用结构体的主要原因,实际上这只是更大范围的一部分。...struct or class 通常这不是问题,但是有一个名为UIStackView的特定子类,它类似于SwiftUI中的VStack和HStack。...1000个SwiftUI视图甚至100,000个SwiftUI视图也是如此。他们是如此之快,以至于不再值得考虑。...通过生成不会随时间变化的视图SwiftUI鼓励我们转向更具功能性的设计方法:在数据转换为UI时,我们的视图变成简单的,惰性的东西,不是会失去控制的智能化的东西。

3.1K10

为什么 SwiftUI视图使用结构体

SwiftUI 并非如此:我们更喜欢结构体用于整体视图,这有两个原因。 首先,有一个性能因素:结构体比类更简单,更快。...我之所以说性能因素,是因为很多人认为这是 SwiftUI 使用结构体的主要原因,实际上这只是更大范围的一部分。...struct or class 通常这不是问题,但是有一个名为 UIStackView 的特定子类,它类似于 SwiftUI 中的 VStack 和 HStack。...1000 个 SwiftUI 视图甚至 100,000 个 SwiftUI 视图也是如此。他们是如此之快,以至于不再值得考虑。...通过生成不会随时间变化的视图SwiftUI 鼓励我们转向更具功能性的设计方法:在数据转换为 UI 时,我们的视图变成简单的,惰性的东西,不是会失去控制的智能化的东西。

2.4K50

SwiftUI 中用 Text 实现图文混排

在下面的代码中,尽管我们通过布局容器视图 Text 横向排列到一起,但 SwiftUI 仍会将它们视作多个 Text 视图( 一组 ),对每个 Text 分别进行换行操作:struct TempView...image-20220814173320321在 SwiftUI 中,除非进行了特别的设置,否则所有字体的尺寸都会跟随动态类型的变化变化。...,通过 SwiftUI 视图创建标签根据标签视图的尺寸创建空白占位图片在 Text 中添加占位图片,进行混排使用 overlay 标签视图定位在 leadingTop 位置,覆盖于占位图片上TitleWithOverlay...,插入 Text 中方案三的解决思路与方案二一样,不使用预制图片,使用 SwiftUI 视图创建标签标签视图转换成图片添加到 Text 中进行混排TitleWithDynamicImage(title...但能用现有的方法来解决这类实际问题,何尝又不是一种挑战和乐趣?至少对我如此。希望本文能够对你有所帮助。

4.2K30

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

本文是 SwiftUI 开发教程中的一篇,我们一起探究上述问题的答案。若你有兴趣学习 iOS 应用程序开发,又或者是想了解 iOS 程序是如何运行的,欢迎关注这一系列文章。...其中 View 表示一个视图,比如我们在手机上看到的一个滑条,一张图片,一个列表等种种,都叫做视图 Modifier 则是修饰器,它的作用是为视图增加功能,比如圆角,动画,阴影,边际,背景等等。...写 SwiftUI 得过程,实际上就是一个个最基本的 View 像滚雪球一样越包越大的过程,你把一个个基础的视图和修改器用一个更大的视图包在一起,用修改器修改更大的视图,就能实现复杂的功能。...纵向排列的 View 在 SwiftUI 里叫做 VStack,它用一个花括号 {包住里面的内容};文字的 View 在 SwiftUI 里叫做 Text。...若你因为文中的长代码感到害怕,觉得程序员都是天才,脑子超好用能将这些代码一次性全写出来,不是这样的。比如上面代码中的例子,一开始你只有一个简单的思路,我要一句名言,能点按复制就行。

2.1K40

干货 | 关于SwiftUI,看这一篇就够了

在组合视图中,闭包中会处理大量的UI组件,FunctionBuilder是通过闭包建立样式,闭包中的UI描述传递给专门的构造器,提供了类似DSL的开发模式。...= nil, @ViewBuilder content: () -> Content) 如果没有FunctionBuilder这一新特性,那么开发者必须对容器视图进行管理,以HStack为例(如下代码所示...作为SwiftUI的新特点之一,FunctionBuilder倾向于目前流行的编程方式,开发者能够使用基于DSL的架构,像SwiftUI不用去考虑具体的实现细节,因为构建器实现的就是一个DSL本身。...单一、简单的响应视图组合到繁琐、复杂的视图中去,而且在Apple的任何平台上都能使用该组件,达到了跨平台(仅限苹果设备)的效果。按照用途大概能够分为基础组件、布局组件和功能组件。...总之在SwiftUI中给一个View设置属性,已经不是为当前元素提供约束,而是用一系列容器来包含当前元素,为后续布局计算做准备。

5.7K10
领券