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

GeometryReader :好东西还是坏东西?

会占用父视图提供的所有空间,并将所有子视图的原点与容器的原点对齐(即放置左上角)。...一些复杂的布局场景中,或者某些设备或系统版本中,布局可能需要经过几轮的协商才能获得最终稳定的结果,尤其是当视图需要依赖 GeometryReader 提供的几何信息来重新确定自己的位置和尺寸时。...这既保证了信息获取的准确性(尺寸、位置与要获取的视图完全一致),也不会在视觉上造成额外的影响。...,然后将 Image 放置 overlay 中。...此外,由于 overlay 支持设置对齐指南,比起 GeometryReader,它可以更方便地调整图片的对齐位置。 另外,GeometryReader 经常用于按照一比例分配两个视图的空间。

45670

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

欢迎大家 Discord 频道[2] 中进行更多地交流将某个视图视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。...image-20220829152914736将合成后的视图放置某个可能会充满屏幕的视图的顶部或底部显示结果或者与你的预期不符 VStack { // Hello world 视图 1...因此,当我们将合成后的 hello world 视图放置 VStack 顶部时( 通过 Spacer ),矩形的 background 会连同顶部的安全区域一并渲染。...另外,在给定尺寸不明的情况下( 未显式为矩形设置尺寸 ),上面的代码也需要进行一的调整。...将 Text 的中心点与给定的位置进行对齐( postion 是一个通过 CGPoint 来对齐中心点的视图修饰器 )当然,你也可以获取 Text 的 Geometry 信息,通过 offset 或

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

SwiftUI geometryGroup() 指南:从原理到实践

SwiftUI 将黄色圆形放置放大后的红色矩形的 topLeading 位置。...唯一让我们不满意的是,创建黄色圆形时(布局它的位置时),它被放置放大后的红色矩形的 topLeading 位置上。...以上面的示例来说,添加了 geometryGroup() 后,父视图( frame )并不是一次性的将自身几何属性的改变状态传递给了子视图,而是将这些变化动画化了后,持续传递给子视图的。...新创建的 Grid 单元格会直接放置尺寸变化后的位置。因此会导致出现非预期的结果。 添加了 geometryGroup() 后。...视图几何信息发生变化时,不要同时视图中创建新的内容 如果一定要在变化时为子视图增加新元素( 比如上面基于 GeometryReader 的示例,可以将所需元素视图变化前便让其存在,通过透明度来调整其可见性

25110

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

GeometryReader 的主要作用就是能够获取到父View建议的尺寸,这就是它的主要作用,要没有它我们面临的可能就是无休止的传值了,SwiftUI 既然是声明式的UI,按我的理解你就没有办法去获取某一个视图的父视图之类的...有一个还得说明一下,GeometryReader 改变了它显示内容的方式。 iOS 13.5 中,内容放置方式为 .center。 iOS 14.0 中则为:.topLeading。...3、再提一点关于上面说的滚动视图UIKit中我们可以用UICollectionView搞定一切,但是SwiftUI中没有这个控件,我建议采用的方式是 ScrollView + HStack + VStack... iOS 13.5 中,内容放置方式为 .center。...之GeometryReader 理解SwiftUI关键字 State Binding ObservesOgiect EnvironmentObje SwiftUI 自定义实现旋转木马轮播效果

11.8K20

SwiftUI 之 HStack 和 VStack 的切换

前言 SwiftUI 的各种堆栈是许多框架中最基本的布局工具,能够让我们定义组视图,这些组视图可以按照水平、垂直或覆盖视图对齐。....background(Color.blue) .cornerRadius(10) } } 以上代码中,我们用到了 fixedSize 防止按钮文本被截断,这仅是我们确信给定的内容视图不会视图本身更大的情况...GeometryReader GeometryReader 能实现吗?...关键的区别在于(除了后者需要 iOS 16 )切换布局可以保留正在渲染的底层视图的标识,而在 HStack 和 VStack 之间切换就不会这样。...这样做会令动画更流畅,例如在切换设备方向时,我们也有可能在执行此类更改时获得小幅的性能提升(因为 SwiftUI 总是在其视图层次结构为静态时尽可能表现最佳) 选择合适的视图 但我们还没有结束,因为

2.8K10

SwiftUI 布局协议 - Part2

当我们改变角度时,SwiftUI 会计算好每个视图最初和最终的位置,然后动画期间内修改它们的位置,从A点到B点成一条直线。...开始的位置和结束的位置是一样的,因此就 SwiftUI 而言,没有动画。 如果这就是你要找的东西,那就太好了,但由于我们将视图围绕一个圆圈放置,如果视图沿着那个假想的圆圈移动不是更有意义吗?...用户使用容器只需要记住将视图封装在 WheelComponent里面。他们不需要担心布局值,绑定,角度等等。当然,不在封装里的视图不会受到任何影响,视图不会旋转指向中心。...过去我们使用 GeometryReader 获取视图尺寸并传递值到父视图的时候遇到过这个问题,然后父视图使用该信息去改变视图,即使用 GeometryReader 去再一次改变,然后我们就陷入了布局循环...在下一个例子中我们将会把前三个视图水平的放置视图顶部,后三个水平的放置底部。剩下的视图将会在中间,垂直排列。

2.7K30

SwiftUI 布局 —— 尺寸( 上 )

ZStack 放置了 152.33, 418.33 处,并为其提供了渲染尺寸( 85.33 x 20.33 ) ZStack 将 Text 放置了 152.33, 418.33 处,并为其提供了渲染尺寸... Layout 协议中,对应的是 sizeThatFits 方法。经过该阶段的协商,SwiftUI 将确定视图所在屏幕上的位置和尺寸。...第二阶段 —— 安置子民 该阶段,父视图将根据 SwiftUI 布局系统提供的屏幕区域( 由第一阶段计算得出 )为子视图设置渲染的位置和尺寸( 上方的 5-6 )。...这类视图本身并不会参与布局,SwiftUI 的布局系统会在布局时自动将它们忽略,让其子视图与具备布局能力的祖先视图直接联系起来。...视图尺寸 视图渲染后屏幕上呈现的尺寸,也是热门提问 —— 如何获取视图的尺寸中所指的尺寸。 视图中可以通过 GeometryReader 获取特定视图的尺寸及位置

4.6K20

掌握 SwiftUI 的 Safe Area

UIKit 中,开发者需要利用 safeAreaInsets 或 safeAreaLayoutGuide ,才能确保将视图放置界面中的可见部分。 SwiftUI 对上述过程进行了彻底的简化。...对于视图层次上的其他视图,safeAreaInesets 只反映视图中被覆盖的部分。如果一个视图可以完整地放置视图的安全区域中,该视图的 safeAreaInsets 为 0。...使用 GeometryReader 获取 GeometryProxy 提供了 safeAreaInsets 属性,开发者可以通过 GeometryReader 获取视图的 safeAreaInsets。...默认的情况下会将用户视图置于安全区之内,因此我们只能得到如下的结果: image-20211120141245282 为了让视图能够突破安全区域的限制,SwiftUI 提供了 ignoresSafeArea...safeAreaInsetList2 遗憾的是, iOS 15 之前,SwiftUI 并没有提供调整视图安全区的手段,如果我们想通过 SwiftUI 的手段创建一个自定义 Tabbar 时,列表中最后的内容将被

7.5K31

SwiftUI中的水平条形图

Bar Chart with multiple data sets in SwiftUI SwiftUI 中的水平条形图 将条形图转换为水平 水平条形图不仅仅是垂直条形图上的配置,有一些元素是可以重复使用的...对于垂直条形图组件和水平条形图组件来说,重复使用一些结构和SwiftUI视图并不简单。标题和关键区域可以原样重用。创建BarChartView的副本,并将其名称改为BarChartHView。...} } } } } } ChartAreaHView与ChartAreaView几乎相同,只是Bars被放置一个垂直的堆栈中...水平条形图中,显示条形图上的数值并隐藏X轴可以使图表更简洁。 显示和隐藏水平条形图上的元素 结论 创建水平条形图的SwiftUI代码与创建垂直条形图的代码不同。...这可能是将这些组件分解成更小的SwiftUI视图并通过组合来重用的原因。

4.7K20

SwiftUI 的方式进行布局

offset 则是渲染层面进行的位置调整,即使出现了位置变化,其他视图布局时,并不会将其位移考虑在其中。...在上面的代码中,由于两个视图使用了同样的动画曲线设定,因此,移动时并不会出现分离的情况。...通过设定 scrollTo 的 anchor,合理的要求下,我们可以让视图停在特定位置。...因此,只需要在状态切换时,调整视图二的对齐指南即可( 视图将自动跟随视图二移动 )。 此种方式视觉上与通过 VStack 的实现类似,但两者需求尺寸上有明显不同。...七、Transition 通过为视图设定 Transition( 转场 ),视图插入或将其移出视图树时,SwiftUI 将自动生成对应的动画效果。

3.2K00

SwiftUI 的方式进行布局

offset 则是渲染层面进行的位置调整,即使出现了位置变化,其他视图布局时,并不会将其位移考虑在其中。...在上面的代码中,由于两个视图使用了同样的动画曲线设定,因此,移动时并不会出现分离的情况。...通过设定 scrollTo 的 anchor,合理的要求下,我们可以让视图停在特定位置。...因此,只需要在状态切换时,调整视图二的对齐指南即可( 视图将自动跟随视图二移动 )。 此种方式视觉上与通过 VStack 的实现类似,但两者需求尺寸上有明显不同。...七、Transition 通过为视图设定 Transition( 转场 ),视图插入或将其移出视图树时,SwiftUI 将自动生成对应的动画效果。

4.7K80

SwiftUI案例:天气

SwiftUI案例:天气 效果 目标 实现静态的仿iOS天气APP程序 文件与配置 外观配置 外观配置需要从 '代码' 中下载文件并提取对应的图片 需要配置 Assets.xcassets...文件中 需要配置 SpriteFiles/Assets.xcassets 文件中 动态图片导入 工作区的项目文件夹下创建名为 SpriteFiles 的 Group 并在其中依次导入...RainFall.sks RainFallLanding.sks 创建View视图 工作区的项目文件夹下创建名为 View 的 Group 并在其中依次创建 Home.swift CustomStackView.swift...CustomCorner.swift WeatherDataView.swift 视图文件 创建Model模板 工作区的项目文件夹下创建名为 Model 的 Group 并在其中创建 Forecast.swift...视图与模板实现 ContentView.swift 这是应用视图的总体框架布局,需要自适应屏幕尺寸 import SwiftUI struct ContentView: View { var

4.7K21

如何在 SwiftUI 中创建条形图

系列文章 如何在 SwiftUI 中创建条形图 SwiftUI 中的水平条形图 iOS 16 中用 SwiftUI Charts 创建一个折线图 iOS16 中用 SwiftUI 图表定制一个线图... Swift 图表中使用 Foudation 库中的测量类型 开始图表布局 SwiftUI 对探索不同布局和预览实时视图结果是很友好的。...条形图上的值使用叠加视图修改移到了条形图的顶部。这个值是偏移的,所以文本不会离条形图的顶部太近。数据名称的字体大小和字重也可以被设置。...文本视图的宽度被限制条形图宽度的范围内,而且条形图的标签文本会被截断,条形图的文本视图也被限制条形宽度的范围内,并且文本可以被隐藏起来。...SwiftUI 是一个很好的平台,用于创建视图和快速重构独立的子视图 SwiftUI 中构建条形图需要做一些工作,随着使用数据来试用条形图,可以确定更多的定制化。

5.1K10

深入了解 SwiftUI 5 中 ScrollView 的新功能

任何超出边界的部分将不会显示。 当 scrollClipDisable 为 true 时,滚动内容不会被裁剪。它可以延伸超出滚动容器的边界,从而显示更多内容。...可采用 优化 SwiftUI List 中显示大数据集的响应效率[5] 一文中介绍的方式来解决。 scrollPostion(id:) 使用此修饰符可以让滚动视图滚动到特定的位置。...(视图标识) 不支持锚点设定,固定锚点为子视图的 center 正如 优化 SwiftUI List 中显示大数据集的响应效率[6] 一文所提到的,当数据集很大时,也会出现性能问题。...通过这个坐标系,开发者可以非常容易地获取子视图与滚动视图之间的位置关系。利用这些信息,我们可以轻松地实现很多效果,尤其是配合另一个新 API,visualEffect 修饰符。...总结 我完全没有想到, SwiftUI 5 中,苹果对 ScrollView 进行了全面增强。值得赞赏的是,他们不仅提供了一些一直期待的功能,而且 API 的设计和实现完成度上都非常出色。

67620

高级 SwiftUI 动画 — Part 2:GeometryEffect

请注意,这些变化将影响视图,但不会影响其祖先或后代的布局。 因为GeometryEffect也符合Animatable,你可以添加一个animatableData属性,然后你就有了一个可动的效果。...你会注意到,三维旋转变换可能与你核心动画中的习惯略有不同。SwiftUI中,默认的锚点是视图的前角,而在Core Animation中是中心。...它将返回一个非常小的矩形,我们将使用其中心作为我们的X和Y位置。...我们将看到GeometryReader是如何报告不同的位置的,这取决于效果是如何被添加的(即,有或没有.ignoredByLayout())。...的 Advanced SwiftUI Animations – Part 2: GeometryEffect 本文的完整示例代码可在以下位置找到: https://gist.github.com/swiftui-lab

1.3K30

SwiftUI 布局 —— 尺寸( 下 )

本篇中,我们将通过对视图修饰器 frame 和 offset 的仿制进一步加深对 SwiftUI 布局机制的理解,并通过一些示例展示布局时需要注意的问题。...,但如果将它们放置到其他的布局容器中,你会发现它们容器内的布局后的摆放结果明显不同 —— 需求尺寸的构成和大小不一样( 下图中,用红框标注了各自的需求尺寸 )。...每种容器都有其适合的场景,例如对于如下需求 —— 创建类似视频 app 中的点赞功能的子视图布局时,仅需考虑手势图标的位置和尺寸),overlay 这种需求尺寸仅依赖于主视图的容器便有了用武之地:...这种直接在 CALayer 层面进行的修改,并不会对布局造成影响 上面或许就是你想要的效果,但如果想实现让位移后的视图能够对它的父视图( 容器 )的布局有所影响 ,或许就需要换一种方式 —— 用布局容器而非...frame 视图修饰器本质上是对布局容器 _FrameLayout 的包装,本例中我们将自定义的布局容器命名为 MyFrameLayout ,视图修饰器命名为 myFrame 。

2.6K40
领券