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

【visionOS】从零开始创建第一个visionOS程序

你也可以在视图中添加SwiftUI手势识别器来处理点击、长按、拖动、旋转和缩放手势。...将3D内容添加到应用程序中 为您的visionOS应用程序添加深度和维度,并发现如何将您的应用程序内容融入人的周围环境。 带有立体显示器的设备可以让人们以一种感觉更真实的方式体验3D内容。...显示动态3D场景使用RealityKitin页面链接 RealityKit是苹果公司用于创建3D模型和场景的技术,你可以在屏幕上动态更新。...视图闭包中的代码为球体创建一个RealityKit实体,在球体表面应用纹理,并将球体添加到视图的内容中。...当指定的手势发生在实体上时,SwiftUI执行提供的闭包。 下面的示例将一个点击手势识别器添加到上一个示例中的球体视图中

71640

SwiftUI 布局 —— 尺寸( 上 )

因此,为了简化文字,我们在文章中会将视图与具备布局能力的容器等同起来。 不过需要注意的是,在 SwiftUI 中,有一类视图是会在视图树上显示为视图,但并不具备布局能力。...例如:ZStack 会将其父视图提供给它的建议模式直接转发给 ZStack 的子视图,而 VStack、HStack 则会要求子视图返回全部模式下的需求尺寸,以判断子视图是否为动态视图( 在特定维度可以动态调整尺寸...( 已处理动态尺寸视图 )的总尺寸,详情请参阅 SwiftUI 布局 —— 对齐[4] 其他控件例如 TextField、TextEditor、Picker 等 需求尺寸取决于建议尺寸和实际显示尺寸 在...SwiftUI 没有提供可以在视图中直接处理渲染尺寸的方式( 除了 Layout 协议 ),通常我们会通过对建议尺寸以及需求尺寸的调整,来影响渲染尺寸。...视图尺寸 视图渲染后在屏幕上呈现的尺寸,也是热门提问 —— 如何获取视图的尺寸中所指的尺寸。 在视图中可以通过 GeometryReader 获取特定视图的尺寸及位置。

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

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

在单元测试中,很难对 SwiftUI 视图中的依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架的优势之一( 将状态从视图中抽离出来,方便测试 )。...比如说我可以在视图中拥有 StateObject,并通过 EnvironmentObject 传递该对象。然而,如果里面的 @Published 属性改变了,视图和它的子树也都被重新计算。...对于苹果工程师给予的建议有一点请注意,那就是如果有在视图中修改该环境对象实例的需求,须确保视图不会被反复重构( SwiftUI 重新创建视图类型的实例 )。...阅读 SwiftUI 的动画机制[8] 一文,了解更多有关动画的内容。自适应高度 SheetQ:如何在 iOS16 中呈现与动态内容高度相匹配的 Sheet?...提问者应该是想通过在视图中不断修改 id 的参数值,来重新初始化 State 的值。

12.2K20

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

前言 List 可能是 SwiftUI 附带的内置视图中最常用的一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图”的用户界面。...作为起点,假设我们正在处理以下 ArticleList 视图,该视图使用 ArticleListViewModel 来呈现文章列表: struct ArticleList: View { @ObservedObject...元素绑定和自定义滑动操作 接下来,让我们看看如何将完全自定义的滑动操作添加到列表中。...由于每个 article 值在 ForEach 闭包中都是可变的,我们可以使用新的 swipeActions 修饰符来实现每个 NavigationLink 项目视图的自定义滑动操作。...} } ... } } 由于上述修饰符是在每个列表的 item 上调用的,而不是在列表本身上调用,这为我们提供了很大的灵活性,可以根据想要构建的 UI 类型动态隐藏或显示每个分隔符

4.8K41

探讨 SwiftUI 中的几个关键属性包装器

详见 避免 SwiftUI 视图的重复计算[7]。 如果不需要在当前视图或在子视图中(通过 @Binding )修改值,无需使用 @State。...它适用于需要在子视图中直接修改视图中的数据情况。 注意事项 应当谨慎使用 @Binding,当子视图只需响应数据变化而无需修改时,无需使用 @Binding。...典型应用场景 通常与 @StateObject 配合使用,视图使用 @StateObject 创建实例,子视图通过 @ObservedObject 引入该实例,响应实例变化。...需要动态切换实例的场景。比如在 NavigationSplitView 中,sidebar 中选择不同的实例,detail 视图动态更换数据源。...比如:PreferenceKey( 子视图传递给视图 )、FocusedValueKey( 基于焦点传递的值 )、LayoutValueKey( 子视图传递给布局容器 )。

19310

SwiftUI 中用 Text 实现图文混排

上述特性有一个基本要求 —— 换行操作是在单一 Text 视图中进行的。...从上图中可以看出,动态类型仅对文本有效,Text 中的图片尺寸并不会发生改变。在使用 Text 实现图文混排时,如果图片不能伴随文本的尺寸变化而变化,就会出现上图中的结果。...一个有关图文混排的问题前几天在聊天室[8]中,一个朋友询问 SwiftUI 是否能实现下图中 tag( 超市标签 )+ 商品介绍的版式效果。...,需要提供分辨率较高的原始图片,这样会造成更多的系统负担方案二:在 Text 上使用覆盖视图方案二的解决思路不使用预制图片,通过 SwiftUI 视图创建标签根据标签视图的尺寸创建空白占位图片在 Text...,插入 Text 中方案三的解决思路与方案二一样,不使用预制图片,使用 SwiftUI 视图创建标签将标签视图转换成图片添加到 Text 中进行混排TitleWithDynamicImage(title

4.2K30

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

可以在预览视图中看到对应的UUID目录名(必须在动态预览模式下才会显示)。 image-20210827150544279 通过清空对应的目录,即可完成上面的1、4、5项。...对于当前视图的环境注入,必须在其祖先视图中完成。 如果视图中声明了对某个环境数据的依赖,而忘记在其祖先视图中注入,并不会导致编译错误。应用程序在运行至该视图时会直接崩溃。...SwiftUI提供的managedObjectContext环境值为在视图中使用或操作Core Data元素提供了基础和便利。...由于前文中提到的SwiftUI App life cycle的独特性,你无法在根视图中使用单例来注入持久化上下文。...通过为此种类型的视图添加一个专门用来处理数据的视图,可以有效的将两种逻辑分割开来。本例仅为演示,通常Connect视图的数据准备工作会复杂的多。

5.1K10

SwiftUI 布局协议 - Part 1

早在2019年,我写了一篇文章SwiftUI 中 frame 的表现[1],其中,我阐述了视图和子视图如何协调形成最终视图效果。那里描述的许多情况需要通过观察不同测试的结果去猜测。...视图层次结构的族动态 在我们开始布局代码之前,让我们重新审视一下 SwiftUI 框架的核心。...就像我在以前的文章 SwiftUI 中 frame 的表现 所描述的的那样,在布局过程中,视图给子视图提供一个尺寸,但最终还是由子视图决定如何绘制自己。然后,它将此传达给视图,以便采取相应的动作。...情况二:如果子视图完全接收提供的视图 图形就是视图中的一个例子,不管你提供了什么他都能接收。在上一个例子中,绿色矩形占据了提供的所有空间,但没有一个多余的像素。...这样, SwiftUI 就会知道如何将其与周围的视图分开,为此,你需要实现布局方法 spacing(subviews:cache:)。

3.2K10

StateObject 与 ObservedObject

请阅读 [SwiftUI 视图的生命周期研究](SwiftUI 视图的生命周期研究 "SwiftUI 视图的生命周期研究") 一文,了解更多有关视图与实例之间的关系属性包装器Swift 的属性包装器(...在 SwiftUI视图添加到视图树上时,调用 _makeProperty 方法将需要持有的订阅关系、强引用等信息保存到 SwiftUI 内部的数据池中。...例如,在某些情况下,开发者需要视图不断地生成全新的可观察对象实例传递给子视图。但由于子视图中使用了 StateObject ,它只会保留首次传入的实例的强引用,后面传入的实例都将被忽略。...尽量使用 @StateObject var testObject = TestObject() 这样不容易出现歧义表达的代码轻量化视图中使用的引用类型的构造方法无论使用 ObservedObject 还是...StateObject 抑或不添加属性包装器,在视图中声明的类实例,都会随着视图描述实例的创建而一遍遍地被多次创建。

2.4K20

onAppear 的调用时机

布局 在计算好当前需要显示的视图所有的视图值后,SwiftUI 将进入到布局阶段。通过视图向子视图提供建议尺寸,子视图返回需求尺寸这一过程,最终计算出完整的布局结果。...判断视图正在求值 在视图中添加类似如下的代码,是我们判断 SwiftUI 是否正在对视图进行求值的常用手段: VStack { let _ = print("evaluate") } 判断视图正处于布局阶段...ProposedViewSize, subviews _: Subviews, cache _: inout ()) {} } 上面的代码创建了一个固定返回 100 * 100 需求尺寸的布局容器,在视图询问其需求尺寸时将通过控制台报告给我们...print("will appear(render)") } } 在上面的代码中,sizeThatFits 与 Layout 协议的 sizeThatFits 调用时机一致,都是在布局过程中,视图向子视图询问需求尺寸时访问...: SwiftUI 首先对视图进行求值( 由外向内 ) 在全部求值结束后开始进行布局( 由视图到子视图 ) 在布局结束后,调用视图对应的 onAppear 闭包( 顺序不明,不要假定 onAppear

1.1K10

onAppear 的调用时机

在一个视图的生存期中,SwiftUI 可能会多次创建视图实例。由于惰性视图的优化机制,对于尚未处于可见区域的子视图SwiftUI 不会创建其实例求值一个被显示的视图至少会经历一次的过程。...布局在计算好当前需要显示的视图所有的视图值后,SwiftUI 将进入到布局阶段。通过视图向子视图提供建议尺寸,子视图返回需求尺寸这一过程,最终计算出完整的布局结果。...判断视图正在求值在视图中添加类似如下的代码,是我们判断 SwiftUI 是否正在对视图进行求值的常用手段:VStack { let _ = print("evaluate")}判断视图正处于布局阶段在...print("will appear(render)") }}在上面的代码中,sizeThatFits 与 Layout 协议的 sizeThatFits 调用时机一致,都是在布局过程中,视图向子视图询问需求尺寸时访问...:SwiftUI 首先对视图进行求值( 由外向内 )在全部求值结束后开始进行布局( 由视图到子视图 )在布局结束后,调用视图对应的 onAppear 闭包( 顺序不明,不要假定 onAppear 之间的执行顺序

2K20

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

欢迎大家在 Discord 频道[2] 中进行更多地交流将某个视图视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。...需求实现下图中展示的样式:在彩色矩形视图中居中显示单行 Textimage-20220829142518962填充物Spacer最常见也是最容易想到的解决方案。...那么 HStack、VStack 会在明确了所有固定尺寸子视图的需求尺寸后,将所剩的可用尺寸( HStack、VStack 的视图给他们的建议尺寸 - 固定尺寸子视图的需求尺寸 )平均分配( 在优先级相同的情况下...我为本文这种通过多种方法来解决一个问题的方式添加了【小题大作】标签,目前使用该便签的文章还有:在 Core Data 中查询和使用 count 的若干方法[6]、在 SwiftUI 视图中打开 URL...视图中打开 URL 的若干方法: https://www.fatbobman.com/posts/open_url_in_swiftUI/[8] Twitter: https://twitter.com

6.6K40

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

默认情况下,SwiftUI 视图会将位置和大小的变化沿视图层级向下传递,以至于只有绘制内容的视图(称为叶子视图)将当前动画应用到它们的框架矩形上。...几何组充当视图与其子视图之间的屏障,迫使位置和大小的值由视图解析和动画化,然后再传递给每个子视图。...出现 “Some Cases” 的条件 至此,我们就可以将官方文档中 “In some cases” 的条件补充完整: 视图的几何属性发生改变,且改变是动画化的 在视图改变的同时( 几何属性的变化...在视图几何信息发生变化时,不要同时在子视图中创建新的内容 如果一定要在变化时为子视图增加新元素( 比如上面基于 GeometryReader 的示例,可以将所需元素在视图变化前便让其存在,通过透明度来调整其可见性...对于 iOS 16,在文字变化较多且较大的情况下,应尽量避免在视图几何信息调整时切换文字内容。 总结 在本文中,我们深入探讨了 SwiftUI 中 geometryGroup() 的重要性和实用性。

25310

SwiftUI 布局 —— 尺寸( 下 )

当用布局容器创建合成视图时,必须将构成后的合成视图容器的布局影响考虑到其中。针对不同的需求,选择恰当的容器。...这种直接在 CALayer 层面进行的修改,并不会对布局造成影响 上面或许就是你想要的效果,但如果想实现让位移后的视图能够对它的视图( 容器 )的布局有所影响 ,或许就需要换一种方式 —— 用布局容器而非...top), anchor: .topLeading, proposal: .init(width: bounds.width, height: bounds.height)) } 现在我们已经可以在视图中使用...fixedSize fixedSize 为子视图的特定维度提供未指定模式( nil )的建议尺寸,以使其在该维度上将理想尺寸作为其需求尺寸返回,并以该尺寸作为自身的需求尺寸返回给视图。..._FlexFrameLayout 实际上是两个功能的结合体: 在设置了 ideal 值且视图的在该维度上提供了未指定模式的建议尺寸时,以 ideal value 作为需求尺寸返回,并将其作为子视图的布局尺寸

2.6K40

SwiftUI 与 Core Data —— 数据获取

本文中我们将探讨在 SwiftUI 视图中批量获取 Core Data 数据的方式,并尝试创建一个可以使用 mock 数据的 FetchRequest。...这将有两个作用:数据变化后将引发与其绑定的视图进行更新由于底层数据并不保存在视图中,因此在视图存续期中 SwiftUI 可以随时创建新的视图描述实例而无需担心数据丢失虽然苹果没有公开 _makeProperty...当 SwiftUI视图存续期中重新创建视图描述实例时,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议的 Struct...不可在 update 方法中同步地改变引发视图更新的数据与 SwiftUI视图中更新 Source of truth 的逻辑一致,在一个视图更新周期中,不能对 Source of truth 再度更新...在 MockableFetchRequest 中,无需在声明时提供 NSFetchRequest,可以在视图加载时,动态地为 MockableFetchRequest 提供所需的 NSFetchRequest

4.6K30

掌握 SwiftUI 的 Safe Area

掌握 SwiftUI 的 Safe Area 访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验 Safe Area(安全区域)是指不与导航栏、标签栏、工具栏或其他视图控制器提供的视图重叠的内容空间...除非开发者明确要求视图突破安全区域的限制,否则 SwfitUI 将尽力确保开发者创建的视图都被布局到安全区域当中。SwiftUI 同时提供了一些方法和工具让开发者对安全区域有所控制。...本文将探讨如何在 SwiftUI 中获取 SafeAreaInsets、将视图绘制到安全区域之外、修改视图的安全区域等内容。...对于视图层次上的其他视图,safeAreaInesets 只反映视图中被覆盖的部分。如果一个视图可以完整地放置在视图的安全区域中,该视图的 safeAreaInsets 为 0。...也可以使用下面的代码,进一步了解 safeAreaInsets 在各个层级视图中的状况。

7.5K31
领券