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

GeometryReader :好东西还是坏东西?

GeometryReader 自 SwiftUI 诞生之初就存在,它在许多场景扮演着重要的角色。然而,从一开始就有开发者对其持负面态度,认为应尽量避免使用。...GeometryReader 不支持对齐指南的调整,因此上面的描述使用了原点。 然而,这并不意味着不能将 GeometryReader 作为视图容器使用某些情况下,它可能比其他容器更适合。...一些复杂的布局场景,或者某些设备或系统版本,布局可能需要经过几轮的协商才能获得最终稳定的结果,尤其是当视图需要依赖 GeometryReader 提供的几何信息来重新确定自己的位置和尺寸时。...这既保证了信息获取的准确性(尺寸、位置与要获取的视图完全一致),也不会在视觉上造成额外的影响。...里子和面子:不同的尺寸数据 SwiftUI ,有一些 modifier 是布局之后,渲染层面对视图进行的调整。

49770

SwiftUI案例:3D旋转图片播放器

SwiftUI案例:3D旋转图片播放器 效果 目标 实现多张图片的3D切换查看功能 外观配置 任选 7 张任意尺寸的图片按 p1 至 p7 进行命名并拖拽进 Assets.xcassets 文件(如图所示...) 创建View视图 工作区的项目文件夹下创建名为 View 的 Group 并在其中依次创建 Home.swift CarouseBodyView.swift ScrollViewOffsetModifier.swift...: 滚动偏量视图,用来设置3D滚动效果; 视图的实现 主视图 Home.swift 大致定义整个屏幕视图的布局与容器接口。...CarouseBodyView.swift 通过视图容器的嵌套布局,实现 Home.swift 组件的文本与图片的具体内容。...import SwiftUI struct ScrollViewOffsetModifier: ViewModifier { //定义顶部锚点 var anchorPoint: Anchor

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

SwiftUI 布局 —— 尺寸( 下 )

SwiftUI ,开发者在对视图进行调整前需要清楚该操作是针对里子( 基于布局机制 )还是面子( CALayer 层面),或者是想通过对面子的修改进而影响里子,只有这样,才能让最终的呈现效果与预期的布局一致...从模仿中学习 本章,我们将通过使用 Layout 协议实现对 frame 和 offset 的仿制以加深对布局过程的不同尺寸概念的认识。...用 viewModifier 包装布局容器 SwiftUI ,通常需要对布局容器进行二次包装后再使用。...对齐[5] 一文我们已经介绍了“对齐”是发生在容器中子视图之间的行为,因此对于 _FrameLayout 这种开发者只提供一个子视图同时又需要对齐的布局容器,我们需要通过 modifier 添加一个..._FrameLayout 容器的需求尺寸,以及子视图的布局尺寸 当只有一个维度设置了具体值 A,则将该值 A 作为 _FrameLayout 容器该维度上的需求尺寸,另一维度的需求尺寸则使用视图该维度上的需求尺寸

2.6K40

掌握 ViewThatFits

iOS 16 ,SwiftUI 增加了一个新的自适应布局容器 ViewThatFits。正如其名称所示,它的作用是在给定的多个视图中找出最合适的视图使用。...它只检查阶段使用视图的理想尺寸进行判断,最终呈现阶段,它将向子视图提交有值的建议尺寸,并使用视图的需求尺寸作为自身的需求尺寸。... SwiftUI ,我们可以通过 fixedSize 来强制一个视图以理想尺寸进行呈现: struct IdealSizeDemo: View { var body: some View {... SwiftUI ,我们可以通过 frame 来修改视图在理想状态下的呈现。...我们已经第一个章节详细阐述了 ViewThatFits 的实现细节(判断规则、呈现逻辑),因此使用 Layout 协议来实现非常方便。

17010

用 SwiftUI 的方式进行布局

0 : -greenSize.height) 尽管本例,offset 和 padding 的视觉呈现一致,但当需要与其他视图一起进行布局时,两者之间还是有很大的不同。...offset 则是渲染层面进行的位置调整,即使出现了位置变化,其他视图布局时,并不会将其位移考虑在其中。...在上面的代码,由于两个视图使用了同样的动画曲线设定,因此,移动时并不会出现分离的情况。...五、LayoutPriority SwiftUI ,设置视图优先级( 使用 layoutPriority )是一个好用但并不常用的功能。...视图二同理 六、再战 AlignmentGuide 在上面使用 AlignmentGuide 的例子,我们通过 GeometryReader 获取了视图二的高度信息,并通过设置显式对齐指南来完成了移动

3.2K00

用 SwiftUI 的方式进行布局

0 : -greenSize.height) 尽管本例,offset 和 padding 的视觉呈现一致,但当需要与其他视图一起进行布局时,两者之间还是有很大的不同。...offset 则是渲染层面进行的位置调整,即使出现了位置变化,其他视图布局时,并不会将其位移考虑在其中。...在上面的代码,由于两个视图使用了同样的动画曲线设定,因此,移动时并不会出现分离的情况。...五、LayoutPriority SwiftUI ,设置视图优先级( 使用 layoutPriority )是一个好用但并不常用的功能。...视图二同理 六、再战 AlignmentGuide 在上面使用 AlignmentGuide 的例子,我们通过 GeometryReader 获取了视图二的高度信息,并通过设置显式对齐指南来完成了移动

4.7K80

如何在 SwiftUI 创建条形图

Swift 图表中使用 Foudation 库的测量类型 开始图表布局 SwiftUI 对探索不同布局和预览实时视图结果是很友好的。...数据使用国家名称条形图中绘制。...条形图上的值使用叠加视图修改移到了条形图的顶部。这个值是偏移的,所以文本不会离条形图的顶部太近。数据名称的字体大小和字重也可以被设置。...SwiftUI 是一个很好的平台,用于创建视图和快速重构独立的子视图 SwiftUI 构建条形图需要做一些工作,随着使用数据来试用条形图,可以确定更多的定制化。...使用 GeometryReader 可以创建适应更多可用环境的条形图。在这篇文章,我们创建了一个简单的条形图,有数值,下面有标签,还有图表的标题,下一步就是分离出 x 轴和 y 轴。 - EOF -

5.1K10

SwiftUI 布局 —— 尺寸( 上 )

这类视图本身并不会参与布局,SwiftUI 的布局系统会在布局时自动将它们忽略,让其子视图与具备布局能力的祖先视图直接联系起来。...即使你对 Layout 协议不了解或短时间无法使用 SwiftUI 4.0 ,并不会影响你对下文的阅读和理解。...为子视图提供不同的建议模式的目的是获得该模式下子视图的需求尺寸,具体使用哪种模式,完全取决于父视图的行为设定。...视图尺寸 视图渲染后屏幕上呈现的尺寸,也是热门提问 —— 如何获取视图的尺寸中所指的尺寸。 视图中可以通过 GeometryReader 获取特定视图的尺寸及位置。...GeometryReader 将建议尺寸作为需求尺寸直接返回( 充满全部可用区域 ) 接下来 在上篇,我们对 SwiftUI 的各种尺寸概念做了介绍,在下篇我们将通过创建 frame、fixedSize

4.7K20

高级 SwiftUI 动画 — Part 2:GeometryEffect

在下面的例子,我们将创建一个水平移动视图的效果,但它也会在开始时倾斜,结束时取消倾斜: 倾斜效果需要在动画的第一个和最后一个20%期间增加和减少。中间,倾斜效果将保持稳定。...你会注意到,三维旋转变换可能与你核心动画中的习惯略有不同。SwiftUI,默认的锚点是视图的前角,而在Core Animation中心。...我们用@Bindingd属性flipped来向视图报告,哪一面是面向用户的。 我们的视图中,我们将使用flipped的值来有条件地显示两个视图中的一个。...然而,在这个具体的例子,我们将使用一个更多的技巧。如果你仔细观察视频,你会发现这张牌一直变化。背面总是一样的,但正面却每次都在变化。因此,这不是简单的为一面展示一个视图,为另一面展示另一个视图。...使用此方法可以转换期间禁用布局更改。视图执行布局计算时,视图将忽略此方法返回的变换。 我很快就会介绍过渡的内容。同时,让我介绍一个例子,使用.ignoredByLayout()有一些明显的效果。

1.3K30

ViewBuilder 研究(下) —— 从模仿中学习

,并不会尝试获取它们的 body 属性内容( Never 是不可触碰的),而是按照其各自特定的逻辑来进行处理。...,需要使用这种方法来获得视图 body 的类型信息 // EmptyView 此时如果现在我们闭包添加两个 EmptyView 会如何呢?...由于 SwiftUI 通过视图层次结构的类型和位置来对视图进行标识,AnyView 将会擦除(隐藏)掉这些重要的信息,因此除非到了必须使用的地步,否则我们应尽量避免 SwiftUI 中使用 AnyView...没有 Modifier 的视图是不完整的 SwiftUI 通过视图修饰符( ViewModifier )为视图的声明提供了巨大的灵活性。本文的最后一部分,我们将对 Modifier 做一点探讨。...为特定视图类型创建 Modifier 除了符合 ViewModifier 协议的通用 modifier 外,SwiftUI 还有很多仅适用于特定视图类型的 modifier,比如 Text 、TextField

3K20

SwiftUI的水平条形图

SwiftUI的水平条形图 水平条形图以矩形条的形式呈现数据类别,其宽度与它们所代表的数值成正比。本文展示了如何在垂直条形图的基础上创建一个水平柱状图。 水平条形图不是简单的垂直条形图的旋转。...Numbers 等应用程序,水平条形图被定义为独立的图表类型,而不是垂直条形图。除了条形差异外,x轴和y轴的格式也需要不同。...将条形图转换为水平 水平条形图不仅仅是垂直条形图上的配置,有一些元素是可以重复使用的。...它控制了图表的布局,其中的三个视图被改为YaxisHView、ChartAreaHView和XaxisHView,它们最初只是垂直条形图中使用视图的副本。...创建垂直条形图时学到的技术可以重复使用,但最好将水平条形图视为与垂直条形图不同的图表。当我们深入到轴等组件时,可以看到两个图表的轴线都是一样的,但是它们的标签和定位在x和y之间是换位的。

4.8K20

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

当然,你也可以利用 Spacer 这个特性,控制 Text HStack 使用的宽度。...因此第一个例子,即使没有为 HStack 设置 spacing ,Text 仍然会使用全部的 HStack 宽度。...提供 300 x 60 的建议尺寸GeometryReader 视图,默认基于 topLeading 对齐( 类似 overlay(alignment:.topLeading) 的效果 )使用 postion...我为本文这种通过多种方法来解决一个问题的方式添加了【小题大作】标签,目前使用该便签的文章还有: Core Data 查询和使用 count 的若干方法[6]、 SwiftUI 视图中打开 URL...Core Data 查询和使用 count 的若干方法: https://www.fatbobman.com/posts/countInCoreData/[7] SwiftUI 视图中打开 URL

6.6K40

SwiftUI 之 HStack 和 VStack 的切换

我们用到了 fixedSize 防止按钮文本被截断,这仅是我们确信给定的内容视图不会视图本身更大的情况。...为了使代码可用性更高,我们不会硬编码让两个堆栈变体使用对齐或间距什么的。...然而,就像上面的代码展示的那样,使用 GeometeryReader 来展示动态切换有一个相当明显的缺点,几何图形阅读器总是会填充水平和垂直方向的所有可用空间(以便测量实际空间)。...使用布局协议 虽然我们最后已经用了非常棒的解决方案,可以在所有支持 SwiftUI 的 iOS 版本中使用,但也让我们来探索一下 iOS 16 引入的一些新的布局工具(写这篇文章时,它作为...关键的区别在于(除了后者需要 iOS 16 )切换布局可以保留正在渲染的底层视图的标识,而在 HStack 和 VStack 之间切换就不会这样。

2.8K10

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

本文将介绍 geometryGroup() 的概念、用法,以及低版本 SwiftUI 使用 geometryGroup() 的情况下如何处理异常。...In Some Cases 为了更好地理解 geometryGroup() 的实际作用,我们需要创建一个因父视图的几何属性发生变化而导致的非预期的子视图呈现,以便弄清楚文档的“某些情况下”到底指的是什么情况...这是因为 SwiftUI ,每个可动画视图根据 transaction 的信息自行决定自身的动画行为。...视图几何信息发生变化时,不要同时视图中创建新的内容 如果一定要在变化时为子视图增加新元素( 比如上面基于 GeometryReader 的示例,可以将所需元素视图变化前便让其存在,通过透明度来调整其可见性...实际开发,尤其是面对复杂动画和布局的场景时,理解并正确使用 geometryGroup() 是至关重要的。 geometryGroup() 为我们提供了一个避免个别情况下出现布局异常的能力。

25510

SwiftUI 官方画图实例详细解析

前言 ---- 在前面几篇关于SwiftUI的文章,我们用一个具体的基本项目Demo来学习了下SwiftUI,里面包含了常见的一些控件使用以及数据处理和地图等等,有兴趣的小伙伴可以去翻翻以前的文章...接着我们在看看箭头是怎么画出来的,具体的代码是把它分成了上面两部分来画,然后通过控制各个点的连接画出了图案,这次使用的还是Path的方法,具体的是下面这个: /// Adds a sequence of.../// 旋转角度 .rotationEffect(angle, anchor: .bottom) } } 最后一步也比较简单,这种某视图另一个制图之上的需要用到...ZStack ,前面的文章我们有介绍和使用过 HStack 和 VStack,这次在这里就用到了 VStack,他们之间没有啥特备大的区别,理解视图视图之间的层级和位置关系就没问题。.../// Z 轴 底部背景之上 ZStack { BadgeBackground() GeometryReader { geometry

98710
领券