首页
学习
活动
专区
圈层
工具
发布

掌握 SwiftUI 的 Safe Area

掌握 SwiftUI 的 Safe Area 访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验 Safe Area(安全区域)是指不与导航栏、标签栏、工具栏或其他视图控制器提供的视图重叠的内容空间...在 UIKit 中,开发者需要利用 safeAreaInsets 或 safeAreaLayoutGuide ,才能确保将视图放置在界面中的可见部分。 SwiftUI 对上述过程进行了彻底的简化。...除非开发者明确要求视图突破安全区域的限制,否则 SwfitUI 将尽力确保开发者创建的视图都被布局到安全区域当中。SwiftUI 同时提供了一些方法和工具让开发者对安全区域有所控制。...对于根视图来说,safeAreaInsets 反映的是状态栏、导航栏、主页提示器以及 TabBar 等在各个边的占用数值。...当视图尚未在屏幕上可见时,该视图的 safeAreaInset 也为 0 。

9K31

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

在 SwiftUI 布局 —— 尺寸( 上 )[8] 一文中,对建议尺寸的几种模式都进行了介绍。如何减少主线程的负担Q:如何避免所有操作都被放置在主线上?...在 NavigationSplitView 的边栏中使用 LazyVStackQ:iOS 16 的新 NavigationSplitView 当前只与主( master )列中的 List 一起工作。...A:在 iOS 16.1 中,你可以在侧边栏里放一个。navigationDestination,这样侧边栏里的 NavigationLink 就会取代详细栏的根视图。...如此一来,边栏视图的样式自由度获得了极大的提高。...但这个滚动有两大问题,1、是一个未公开的半成品,有可能会被从 SwiftUI 框架中移除;2、不支持懒加载,即使和 Lazy 视图一起使用也会一次性加载全部的视图。

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

    SwiftUI 中的内容边距

    今天,我们将了解 SwiftUI 引入的新内容边距概念以及它与安全区域的区别。创建示例让我们从一个简单的示例开始,演示带有一百个项目的列表。...使用 contentMargins我们需要一种区分视图的内容和工具栏,并仅移动内容而保持工具栏在原地的方法。...总结本文介绍了 SwiftUI 中的内容边距管理,通过对比安全区域的概念,解释了内容边距的重要性。文章从创建示例开始,展示了在列表视图中如何处理内容边距的问题。...随后,通过介绍 UIKit 中的 readableContentGuide 布局指南以及 SwiftUI 中的 safeAreaPadding 视图修饰符,展示了在 iPad 上适配内容边距的方法。...最后,引入了 contentMargins 视图修饰符,并详细解释了其用法和参数,以及如何使用它来管理内容边距。通过本文,读者可以更好地理解并掌握 SwiftUI 中内容边距的管理技巧。

    1.6K32

    onAppear 的调用时机

    在一个视图的生存期中,SwiftUI 可能会多次创建视图实例。由于惰性视图的优化机制,对于尚未处于可见区域的子视图,SwiftUI 不会创建其实例求值一个被显示的视图至少会经历一次的过程。...有关布局的流程请阅读 SwiftUI 布局 —— 尺寸 渲染SwiftUI 通过调用更加底层的 API,将视图在屏幕上呈现的过程。此过程严格意义上已经不属于 SwiftUI 的管理范畴了。...判断视图正在求值在视图中添加类似如下的代码,是我们判断 SwiftUI 是否正在对视图进行求值的常用手段:VStack { let _ = print("evaluate")}判断视图正处于布局阶段在...4.0 中版本中,SwiftUI 提供了 Layout 协议,允许我们创建自定义布局容器,通过创建符合该协议的实例,我们便可以判断当前视图是否正处于布局阶段。...首先对视图进行求值( 由外向内 )在全部求值结束后开始进行布局( 由父视图到子视图 )在布局结束后,调用视图对应的 onAppear 闭包( 顺序不明,不要假定 onAppear 之间的执行顺序 )渲染视图由此可以证明

    2.4K20

    onAppear 的调用时机

    在一个视图的生存期中,SwiftUI 可能会多次创建视图实例。 由于惰性视图的优化机制,对于尚未处于可见区域的子视图,SwiftUI 不会创建其实例 求值 一个被显示的视图至少会经历一次的过程。...有关布局的流程请阅读 SwiftUI 布局 —— 尺寸[5] 渲染 SwiftUI 通过调用更加底层的 API,将视图在屏幕上呈现的过程。此过程严格意义上已经不属于 SwiftUI 的管理范畴了。...判断视图正在求值 在视图中添加类似如下的代码,是我们判断 SwiftUI 是否正在对视图进行求值的常用手段: VStack { let _ = print("evaluate") } 判断视图正处于布局阶段...在 4.0 中版本中,SwiftUI 提供了 Layout 协议,允许我们创建自定义布局容器,通过创建符合该协议的实例,我们便可以判断当前视图是否正处于布局阶段。...首先对视图进行求值( 由外向内 ) 在全部求值结束后开始进行布局( 由父视图到子视图 ) 在布局结束后,调用视图对应的 onAppear 闭包( 顺序不明,不要假定 onAppear 之间的执行顺序

    1.4K10

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

    然而,这是否符合我们的预期效果呢? 我认为,对于许多开发者来说,他们更希望黄色的圆形能够像红色矩形一样,通过动画的方式从原始的 topLeading 位置移动到放大后的 topLeading 位置。...TopLeadingTest1 根据从父视图 frame 接收到的建议尺寸变化,根据其默认布局形态(充满全部可用空间)改变了自身的大小。...当 SwiftUI 在 overlay 中布局黄色圆形时(topLeading),此时红色矩形的尺寸(尽管仍在以动画的形式逐渐扩大)已经是调整后的 300 x 300。...上述每个过程的执行都严格且完美地遵循了 SwiftUI 的布局和动画规则。唯一让我们不满意的是,在创建黄色圆形时(布局它的位置时),它被放置在放大后的红色矩形的 topLeading 位置上。...geometryGroup() 为我们提供了一个避免在个别情况下出现布局异常的能力。这是 SwiftUI 开发团队在完成了基本的布局功能后,腾出精力,进一步改善细节的一个表现。

    68310

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

    其他填充物那么,我们是否可以利用其它的视图实现与 Spacer 类似的填充效果呢?...x 60 建议尺寸( Rectangle 将使用全部的尺寸 )使用 OverlayLayout 布局容器对 Rectangle 及 Text 进行布局,建议尺寸采用主视图的需求尺寸( Rectangle...的需求尺寸 )Text 与 Rectangle 按照对齐指南 center 进行对齐那么是否可以用 background 实现类似的样式呢?...总结本文选取了一些有代表性的解决方法,随着 SwiftUI 功能的不断增强,会有越来越多的手段可供使用。万变不离其宗,掌握了 SwiftUI 的布局原理,无论需求如何变化都可轻松应对。...專欄 #4 Color 不只是顏色: https://www.ethanhuang13.com/p/swiftui-4-not-just-color[4] SwiftUI 布局 —— 尺寸( 下 ):

    8.7K40

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

    SwiftUI为visionOS添加了3D场景类型,还为所有场景类型添加了3D元素和布局选项。 创建你的Xcode投影页面链接 在Xcode中选择File >新比;项目。...点击并拖动应用程序内容下方的窗口栏,以重新定位窗口在环境中的位置。将指针移动到窗口栏旁边的圆圈上,显示窗口的关闭按钮。将光标移动到窗口的一个角落,以将窗口栏变为调整大小控件。...使用ZStack布局视图。 动画视图相关的变化与transform3DEffect(_:)。...当你的空间可见时,其他应用程序仍然隐藏,但当你关闭它时,它们会返回。如果你的应用程序定义了多个空格,你必须在显示一个不同的空格之前取消当前可见的空格。...如果不取消可见空间,那么当您尝试打开另一个空间时,系统将发出运行时警告。

    2.2K40

    自定义 SwiftUI 中符号图像的外观

    .imageScale(.large)}.font(.headline)不建议通过应用resizable()修饰符并设置框架来调整符号图像的大小,因为这样做会使图像停止作为符号图像,从而影响其与文本的布局和对齐...例如,我们的温度计符号具有白色轮廓,在白色背景上是不可见的。并非所有符号都支持每种呈现模式。图层较少的符号在不同模式下看起来可能相同,分层和调色板模式看起来类似于单色。...轮廓变体在工具栏、导航栏和列表中非常有效,而填充变体则用于强调选择的状态。...轮廓变体在工具栏、导航栏和列表中非常有效,因为这些地方通常会与文本一起显示符号。将符号封装在圆形或方形等形状中可以增强其可读性,特别是在较小尺寸下。...例如,iOS 标签栏通常使用填充变体,而导航栏则偏好轮廓变体。这种自动选择确保符号在不同上下文中有效使用,而无需明确指定。

    1.2K10

    GeometryReader :好东西还是坏东西?

    会占用全部可用空间,因此可能会破坏整体的布局设计。...因此,可能会有开发者认为 GeometryReader 并没有按照预期充满全部的可用空间。但实际上,它的显示结果是完全正确的,这就是正确的布局结果。...如果你对此还不太了解,建议你继续阅读以下文章:SwiftUI 布局 —— 尺寸(上)[5]、SwiftUI 布局 —— 尺寸(下)[6]、SwiftUI 布局 —— 对齐[7]。...父视图是否根据子视图的需求尺寸来放置子视图,以及子视图是否根据父视图给出的建议尺寸来返回需求尺寸,完全取决于父视图和子视图的预设规则。...不过,大家是否想过,其实在很多场景中,GeometryReader 本来就并非最优解。与其说避免使用,到不如说用更加 SwiftUI 的方式来进行布局。

    1.3K70

    SwiftUI 布局 —— 尺寸( 上 )

    SwiftUI 布局过程速览 SwiftUI 的布局就是布局系统通过为视图树上的节点提供必要的信息,最终计算出每个视图( 矩形 )所需的尺寸以及摆放位置的行为。...可以说 Layout 协议是一个用来观察和验证 SwiftUI 布局运作原理的优秀工具。 建议尺寸 SwiftUI 的布局是从外向内进行的。...顾名思义,建议尺寸是父视图为子视图提供的建议,子视图在计算其需求尺寸时是否考虑建议尺寸完全取决于它自己的行为设定。...例如:ZStack 会将其父视图提供给它的建议模式直接转发给 ZStack 的子视图,而 VStack、HStack 则会要求子视图返回全部模式下的需求尺寸,以判断子视图是否为动态视图( 在特定维度可以动态调整尺寸...例如在上文中,SwiftUI 为所有的 Shape 设置的默认理想尺寸为 10 x 10 ,Text 默认的理想尺寸为单行完整显示全部内容所需的尺寸。

    5.4K20

    SwiftUI 4.0 的全新导航系统

    navigationViewStyle(.columns) navigationSplitView_3_demo 相较于通过 navigationViewStyle 设定 NavigationView 样式的做法,一分为二的方式将让布局表达更加清晰...在进入当前视图时,无论是否进入目标视图,均将创建其实例( 不对 body 求值 ) NavigationLink("SubView2", destination: SubView2...分栏布局 在 SwiftUI 4.0 之前的版本,可以这样使用 NavigationView 来创建拥有左右两个栏的编程式导航视图: class MyStore: ObservableObject {...与 NavigationStack 合作 在 SwiftUI 4.0 之前,对于多栏的 NavigationView ,如果我们想在 SideBar 栏内实现堆栈跳转的话,可以使用如下代码: struct...到了 SwiftUI 4.0 版本后,SwiftUI 已经将其真正的视为了 Button 。

    11.5K62

    Qt编写自定义控件47-面板区域控件

    ,被访人信息一个面板,这样相当于分类展示了,还提供了对应的标题栏有文字显示,这个控件的使用场景也是非常多,还有个子标题可以设置,拓展了报警闪烁的接口。...二、实现的功能 1:支持所有widget子类对象,自动产生滚动条 2:支持自动拉伸自动填充 3:提供接口获取容器内的所有对象的指针 4:可设置是否自动拉伸宽度高度 5:可设置设备面板之间的间距和边距 三...QGridLayout *gridLayout; //设备表格布局 int margin; //边距 int...widgets) { gridLayout->removeWidget(widget); widget->setVisible(false); } //重新添加到布局中并可见...超过130个可见控件,6个不可见控件。 部分控件提供多种样式风格选择,多种指示器样式选择。 所有控件自适应窗体拉伸变化。 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。

    2K20

    实现边到边的体验 | 让您的软键盘动起来 (一)

    实现边到边跟软键盘有什么关系? 其实,实现边到边不单单只是在状态栏和导航栏之后渲染。应用本身需要开始负责处理那些跟应用重叠的系统 UI 的部分。 正如我们前面提到的,两个最直观的例子是状态栏和导航栏。...应用如何实现边到边? 如果我们回想 去年的介绍,实现边到边可以分为三步: 改变系统栏的颜色 设置全屏布局 处理视觉冲突 我们会跳过第一步,因为从去年至今这个部分没有改动。...View.SYSTEM_UI_FLAG_LAYOUT_STABLE or // 通知系统,视窗希望在导航栏被隐藏的情况下如何布局内容。...: getInsets(type: Int) 会返回指定类型的可见边衬区。...getInsetsIgnoringVisibility(type: Int) 会返回所有边衬区,无论它们是否可见。

    1.6K20

    实现边到边的体验 | 让您的软键盘动起来 (一)

    实现边到边跟软键盘有什么关系? 其实,实现边到边不单单只是在状态栏和导航栏之后渲染。应用本身需要开始负责处理那些跟应用重叠的系统 UI 的部分。 正如我们前面提到的,两个最直观的例子是状态栏和导航栏。...应用如何实现边到边? 如果我们回想 去年的介绍,实现边到边可以分为三步: 改变系统栏的颜色 设置全屏布局 处理视觉冲突 我们会跳过第一步,因为从去年至今这个部分没有改动。...View.SYSTEM_UI_FLAG_LAYOUT_STABLE or // 通知系统,视窗希望在导航栏被隐藏的情况下如何布局内容。...: getInsets(type: Int) 会返回指定类型的可见边衬区。...getInsetsIgnoringVisibility(type: Int) 会返回所有边衬区,无论它们是否可见。

    67420

    SwiftUI 视图的生命周期研究

    •在 NavigationView 中,如果在 NavigationLink 中使用了静态的目标视图,SwiftUI 将会为所有的目标视图创建实例,无论是否访问。...因此,我认为应该以视图是否参与或影响了其父视图的布局作为 onAppear 和 onDisappear 的触发条件。如果用此条件来解释上面的情况便完全可以说的通了。...•ScrollView + VStack 中,即使 Cell 视图没有出现在可见区域,但它在最开始就会参与容器的布局,因此会在创建初始便触发 onAppear,但无论如何滚动,所有的 Cell 视图始终会参与布局...父视图恰恰是以该视图是否影响自身的布局为依据,来调用 onAppear 和 onDisappear 内的闭包,这也是为什么这两个修饰器的作用范围是父视图而不是视图本身。...至于是否取消,仍由 task 中的闭包自己决定。

    5.3K30
    领券