SwiftUI中GeometryReader与GeometryProxy的理解与使用

news2024/11/26 17:30:31

SwiftUI中的GeometryReader是一个视图,使用它我们可以很容易地访问父视图的大小和位置,并使用这些信息来创建一个响应式布局,以适应不同的设备和方向。
在本文中,我们将探索使用GeometryReader的好处,并提供一些如何在项目中使用它的示例。

基本使用

GeometryReader的闭包中提供了一个GeometryProxy的变量,用于访问容器视图的大小和空间坐标的代理。

struct GeometryReaderDemo: View {
  var body: some View {
    GeometryReader { geometry in
      VStack(spacing: 10) {
        Text("GeometryReader")
          .font(.title)
        Text("geometry size: \(geometry.size)")
          .font(.subheadline)

        HStack(spacing: 0) {
          Button("Button 1") {}
            .frame(width: geometry.size.width/3, height: 50)
            .background(.orange)
          Button("Button 2") {}
            .frame(width: geometry.size.width/3, height: 50)
            .background(.yellow)
          Button("Button 3") {}
            .frame(width: geometry.size.width/3, height: 50)
            .background(.green)
        }
      }
    }
  }
}

在这里插入图片描述
上面的代码中,讲得到的父视图宽度三分,分别设置给了三个Button。

在比如下面这个,我们可以给GeometryReader设置任意宽度,其内部的圆形直径永远都是GeometryReader宽度的一半,根本不用在调整Circle的尺寸。

在这里插入图片描述
还有一点值得提一下,先看下面这个图:
在这里插入图片描述
上面代码中竖向显示了3个Text,对三个Text的父视图VStack加了颜色,以及GeometryReader也加了背景颜色。很明显能看得出来GeometryReader的尺寸是全屏尺寸,不过这是一个首选大小,而不是绝对大小,具体还是取决于GeometryReader的父视图,我们可以显示地给GeometryReader添加frame修饰符。

另外在GeometryReader内部,所有的组件都是左上角到右下角布局的,这个和我们在UIKit中的坐标系很像。GeometryReaderSwiftUI中的其他组件的布局不太一样。

很多时候GeometryReader中放了Color.clear,因为颜色会自动填充父视图的大小,所以GeometryReader也是其父视图的大小,将这个组合放到ScrollViewbackground修饰符中,可以计算一些偏移量,内容总尺寸什么的,比如在这篇文章中就涉及到了,这里就不过多说明了。

coordinates 理解与使用

除了简单的size属性,GeometryProxy还提供了一个frame(in:)方法,该方法返回视图在指定坐标空间的frame数据。

func frame(in coordinateSpace: CoordinateSpace) -> CGRect

CoordinateSpace主要有三种:

  • 全局坐标空间:相对于视图层次结构根的全局坐标空间。也就是相对于整个屏幕。
  • 局部坐标空间:相对于当前视图的局部坐标空间。。
  • 自定义坐标空间:将coordinateSpace()修饰符附加到视图上来创建自定义坐标空间——该视图的任何子视图都可以读取相对于该坐标空间的frame。

可能不太好理解,看看下面的示例,有助于理解,首先明确一点,frame(in:)方法返回的是调用者GeometryProxy实例对象的frame信息,也就是GeometryReaderframe信息。

  var body: some View {
    // 上面红色 高度100
    VStack(spacing: 0) {
      Color.red
        .frame(height: 100)

      HStack(spacing: 0) {
        // 左侧蓝色 宽度100
        Color.blue
          .frame(width: 100)

        // 中间橘黄色
        VStack(spacing: 0) {
          // GeometryReader 绿色
          GeometryReader { proxy in
            VStack(spacing: 0) {
              Color.green
                .onTapGesture {
                  printFrameMessage(proxy: proxy)
                }
            }
          }
          .background(.orange)
          .padding(50) // GeometryReader四边缩进50.
        }
        .background(Color.orange)
        .coordinateSpace(name: "Custom")

        // 右侧蓝色 宽度100
        Color.blue
          .frame(width: 100)
      }

      // 下面红色 高度100
      Color.red
        .frame(height: 100)
    }
  }

  private func printFrameMessage(proxy: GeometryProxy) {
    print("Screen size: \(UIScreen.main.bounds.size)")
    print("Global center: \(proxy.frame(in: .global).midX) x \(proxy.frame(in: .global).midY)")
    print("Custom center: \(proxy.frame(in: .named("Custom")).midX) x \(proxy.frame(in: .named("Custom")).midY)")
    print("Local center: \(proxy.frame(in: .local).midX) x \(proxy.frame(in: .local).midY)")
  }

在这里插入图片描述
上面代码中,绿色部分为GeometryReader,并添加了点击事件,点击后显示出该GeometryReader相对于三个坐标空间的中心点坐标信息。

整个屏幕为global坐标空间。
橘黄色部分为自定义坐标空间,代码中添加了.coordinateSpace(name: "Custom")
绿色部分为local坐标空间。

关于各颜色块的尺寸代码中有标注。

点击绿色区域后,打印出的信息如下,各数据已在上图中有标出,一目了然。

Screen size: (393.0, 852.0)
Global center: 196.5 x 438.5
Custom center: 96.5 x 279.5
Local center: 46.5 x 229.5

写在最后

本文主要介绍了GeometryReader的用法,以及使用GeometryProxy读取framecoordinates数据,介绍了三种坐标系,文中所有代码都测试过,如果有不正确的地方,还望大家指正。

最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1796989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iPhone 16 Pro 将打破智能手机上最窄边框的记录

iPhone 16 Pro 据悉,苹果即将发布的 iPhone 16 Pro 将拥有令人瞩目的超窄边框设计,这一创新将超越目前市场上所有智能手机的边框宽度,甚至相较于其前代产品 iPhone 15 Pro 而言也更为出色。 根据多方消息透露,虽然整体设计变化…

打造新引擎,迈向数智金融新未来

数智技术正在全面赋能金融机构转型升级以及促进金融与实体经济的加速融合,已呈现出金融机构数智化经营加速、产业 数字金融深度融合、数字技术驱动绿色金融发展、金融信创成果涌现、金融机构加快数字化组织管理变革等行业趋势。 根据银行业协会调研,78%…

HTML静态网页成品作业(HTML+CSS)—— 节日母亲节介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

【Android】使用EventBus进行线程间通讯

EventBus 简介 EventBus:github EventBus是Android和Java的发布/订阅事件总线。 简化组件之间的通信 解耦事件发送者和接收者 在 Activities, Fragments, background threads中表现良好 避免复杂且容易出错的依赖关系和生命周期问题 Publisher使用post发出…

界面控件Telerik UI for WPF中文教程 - 用RadSvgImage升级应用程序UI

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…

IIS漏洞

IIS7.5解析漏洞 安装IIS7.5 安装完成之后直接访问浏览器: 安装phpstudy for IIS 安装这个的目的是方便,不用自己去配置 解压开傻瓜式安装即可。然后查看探针: 漏洞原理 IIS7/7.5在Fast-CGI运行模式下,在一个文件路径(/shell.jpg)后面加上/…

Linux日志服务rsyslog深度解析(上)

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、日志在Linux系统中的作用 2、rsyslog历史背景 …

postgresql常用命令#postgresql认证

PostgreSQL 是一个功能强大的开源关系数据库管理系统,提供了一系列命令行工具来管理和操作数据库。以下是一些常用的 PostgreSQL 命令,涵盖数据库和用户管理、数据操作以及查询和维护等方面。 #PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试…

微信小程序多端框架打包后发布到APP Store

IPA 上架 App Store 生成 iOS 证书和 Provisioning Profile iOS 开发者账号缴/续费的发票查看和获取 个人开发者把小程序发布到 App Store 5个步骤(保姆级教程) 一、参数的设置、证书的生成、生成profile文件 微信小程序多端应用Donut IOS相关的参数…

基于springboot实现农产品直卖平台系统项目【项目源码+论文说明】

基于springboot实现农产品直卖平台系统的设计演示 摘要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔…

C语言 RTC时间(年月日时分秒) 和 时间戳 互相转换

一、介绍 在C语言中,将年月日时分秒转换为时间戳(Unix时间戳,即从1970年1月1日00:00:00 UTC到现在的秒数)通常需要使用struct tm结构体和timegm或mktime函数。(注意,mktime函数假设struct tm是本地时间&…

【会议征稿,SPIE独立出版】第三届智能机械与人机交互技术学术会议(IHCIT 2024,7月5-7)

由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT 2024)将定于2024年7月5-7日于中国杭州召开。 大会面向基础与前沿、学科与产业&#x…

传输协议TCP-原理部分

传输控制协议TCP(Transmission Control Protocol)一种基于连接的可靠的稳定的无重复的传输协议。 1、TCP头部信息 TCP协议头部信息如下: 一共占用20个字节 16位源端口号:发送进程的主机端口16位目的端口号:接收主机…

ComfyUI 完全入门:AI抠图/去除背景/更换图片背景/更换视频背景

本文继续给大家分享ComfyUI的基本使用技巧:抠图,或者说去除背景。抠图是处理图片的一项常见工作,是设计师们的基本能力,现在有了AI,抠图的效率也得到了极大的提升。最近看到有小伙伴通过AI抠图赚了外国人1000美刀&…

中职电子应用技术专业教学解决方案

前言 在21世纪的信息时代,电子技术作为科技进步的基石,其重要性不言而喻。随着产业的快速发展,对中职电子应用技术专业人才的需求日益增长,不仅要求学生掌握扎实的专业技能,还强调其实践能力与创新能力的培养。为应对这…

Spring-Security(一)-源码分析及认证流程

Spring Security & Oauth2系列: Spring Security(一) 源码分析及认证流程 Spring Security(二)OAuth2认证详解及自定义异常处理 文章目录 1、Spring Security 概述1.1 Spring Security项目核心模块 1.2 Spring S…

小猪APP分发:高效的APP托管服务分发平台

有没有遇到过这样的尴尬?辛辛苦苦开发了一个APP,却在托管和分发环节卡壳。想想看,花了那么多时间精力开发的APP,却因为分发不顺利而影响用户体验,实在是让人抓狂。而小猪APP分发就成了你最好的选择。 APP封装分发www.…

LabVIEW如何确保步进电机的长期稳定运行

步进电机因其良好的定位精度和控制性,在自动化设备中得到了广泛应用。然而,长期稳定运行对于任何电机系统都是一个重要的挑战。LabVIEW作为一款强大的图形化编程语言,通过其灵活的控制算法和实时监控能力,为步进电机的稳定运行提供…

探索Adobe XD:高效UI设计软件的中文入门教程

在这个数字化世界里,创意设计不仅是为了吸引观众的注意,也是用户体验的核心部分。强大的设计工具可以帮助设计师创造出明亮的视觉效果,从而提高用户体验。 一、Adobe XD是什么? Adobe XD是一家知名软件公司 Adobe Systems 用户体…

数据加密验签机的工作原理

数据加密验签机,作为网络安全领域的关键设备,其重要性不言而喻。以下是对数据加密验签机的详细介绍: 一、引言 在数字化时代,数据的机密性、完整性和真实性是企业和个人都极为关注的问题。数据加密验签机,正是为了解决…