SwiftUI中的手势(MagnificationGesture、 RotationGesture)

通过前两篇文章的探索,手势的基本使用规则已经较深的了解,本篇文章主要看看放缩手势MagnificationGesture和旋转手势RotationGesture

MagnificationGesture 放缩手势

放缩手势在App中用的也比较广泛,下面先看一个示例效果:
在这里插入图片描述
上面示例中将图片进行了放大,主要使用了MagnificationGesture手势,并对该手势添加了.updating.onEnded修饰符。

在添加.updating修饰符的时候绑定了一个@GestureState修饰的scalingRatio变量,用来记录每次放大的比例值,每次放缩结束该值重置。

同时为了每次的放缩都基于上次的大小继续放缩,需要用一个@State修饰的变量记录每次放缩结束的比例值,并在.onEnded修饰符中进行赋值。

.gesture(
  MagnificationGesture()
    .updating($scalingRatio, body: { value, state, _ in
      state = value
    })
    .onEnded({ value in
      lastRatio *= value
    })
)

有了这两个值后,在Image图片上添加.scaleEffect修饰符,改变Image的尺寸。

.scaleEffect(scalingRatio)
.scaleEffect(lastRatio)

如果用一个.scaleEffect修饰符,记得将两个变量相乘。

.scaleEffect(scalingRatio * lastRatio)

另外在视图的顶部对scalingRatiolastRatio两个变量进行了显示,可以直观的观察整个放缩过程中,这两个变量的变化。

在松手的时候,想要将图片变回原来的尺寸,只需要将lastRatio以及相关代码移除即可。

完成代码如下:

struct MagnificationGestureDemo: View {

  @GestureState private var scalingRatio: CGFloat = 1.0
  @State private var lastRatio: CGFloat = 1.0

  var body: some View {
    ZStack {
      VStack {
        Text("scalingRatio: \(scalingRatio)")
        Text("lastRatio: \(lastRatio)")
        Spacer()
      }
      Image("liuyifei")
        .resizable()
        .frame(width: 200, height: 260)
        .scaleEffect(scalingRatio)
        .scaleEffect(lastRatio)
        .gesture(
          MagnificationGesture()
            .updating($scalingRatio, body: { value, state, _ in
              state = value
            })
            .onEnded({ value in
              lastRatio *= value
            })
      )
    }
  }
}

RotationGesture 旋转手势

旋转手势和放缩手势用法基本上是一致的,先看一下示例效果:
在这里插入图片描述
上面示例中将图片进行了旋转,主要使用了RotationGesture手势,并对该手势添加了.updating.onEnded修饰符。

在添加.updating修饰符的时候绑定了一个@GestureState修饰的rotateAngle变量,用来记录每次旋转的角度,每次旋转结束该值重置。

同时为了每次的旋转都基于上次的角度继续旋转,需要用一个@State修饰的变量记录每次旋转的角度,并在.onEnded修饰符中进行赋值。

.gesture(
  RotationGesture()
    .updating($rotateAngle, body: { value, state, _ in
      state = value
    })
    .onEnded({ value in
      let newDegress = lastAngle.degrees + value.degrees
      lastAngle = Angle(degrees: newDegress)
    })
)

有了这两个值后,在Image图片上添加.rotationEffect修饰符,改变Image的尺寸。

.rotationEffect(rotateAngle)
.rotationEffect(lastAngle)

如果用一个.rotationEffect修饰符,需要将两个变量的degrees相加构建一个新的Angle传入进去。

.rotationEffect(Angle(degrees: rotateAngle.degrees + lastAngle.degrees))

另外在视图的顶部对rotateAnglelastAngle两个变量进行了显示,可以直观的观察整个旋转过程中,这两个变量的变化。

在松手的时候,想要将图片变回原来的角度,只需要将lastAngle以及相关代码移除即可。

完成代码如下:

struct RotationGestureDemo: View {
  @GestureState private var rotateAngle: Angle = Angle(degrees: 0.0)
  @State private var lastAngle: Angle = Angle(degrees: 0.0)

  var body: some View {
    ZStack {
      VStack {
        Text("rotateAngle: \(rotateAngle.degrees)")
        Text("lastAngle: \(lastAngle.degrees)")
        Spacer()
      }
      Image("liuyifei")
        .resizable()
        .frame(width: 200, height: 260)
        .rotationEffect(rotateAngle)
        .rotationEffect(lastAngle)
        .gesture(
          RotationGesture()
            .updating($rotateAngle, body: { value, state, _ in
              state = value
            })
            .onEnded({ value in
              let newDegress = lastAngle.degrees + value.degrees
              lastAngle = Angle(degrees: newDegress)
            })
      )
    }
  }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

必示科技参与智能运维国家标准预研线下编写会议并做主题分享

近日,《信息技术服务 智能运维 第3部分:算法治理》(拟定名)国家标准预研阶段第一次编写工作会议在杭州举行。本次会议由浙商证券承办。 此次编写有来自银行、证券、保险、通信、高校研究机构、互联网以及技术方等29家单位&#xf…

前端vue 动态加载ts文件,动态调用ts内的方法

业务场景: 在某个业务场景中, 我们需要在数据库配置ts文件路径,和需要调用的函数名称, 前端需要再指定的场景下,触发对应的函数, 并执行处理逻辑,返回结果. 实现: 这是一个数据库配置生成的动态表单 动态校验的例子, 需要引用动态的函数校验 任意一个js文件, common1.ts c…

运算符重载(上)

目录 运算符重载日期类的比较判断日期是否相等判断日期大小 赋值运算符重载赋值运算符重载格式赋值运算符只能重载成类的成员函数不能重载成全局函数用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝 感谢各位大佬对我的支持…

Blender导出fbx模型,导入到ue5中模型丢失纹理材质

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题原因二、最终效果 前言 Blender导出fbx模型,导入到ue5中,发现模型丢失纹理材质,里面的原神人物模型妮露居然是白模,郁闷了大半天 一、问题原因 我在Blender导出fbx文件时…

如何高效创建与配置工程环境:零基础入门

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、工程环境的搭建与准备 二、配置虚拟环境与选择解释器 三、编写代码与自动添加多行注释 …

Mybatis Cache(一)MybatisCache+Redis

前面提到了,使用mybatis cache,一般是结合redis使用。 一、demo 1、数据表 create table demo.t_address (id int auto_incrementprimary key,address_name varchar(200) null,address_code varchar(20) null,address_type int n…

6.小程序页面布局 - 账单明细

文章目录 1. 6.小程序页面布局 - 账单明细1.1. 竞品1.2. 布局分析1.3. 布局demo1.4. 页面实现-头部1.5. 账单明细1.5.1. 账单明细-竞品分析1.5.2. 账单明细-实现1.5.2.1. 账单明细-实现-mock数据1.5.2.2. 每日收支数据的聚合整理1.5.2.3. 页面scroll-view 1.6. TODO 1. 6.小程序…

雷电预警监控系统:守护安全的重要防线

TH-LD1在自然界中,雷电是一种常见而强大的自然现象。它既有震撼人心的壮观景象,又潜藏着巨大的安全风险。为了有效应对雷电带来的威胁,雷电预警监控系统应运而生,成为现代社会中不可或缺的安全防护工具。 雷电预警监控系统的基本…

Convolutional Occupancy Networks【ECCV2020】

论文:https://arxiv.org/pdf/2003.04618 代码:GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1:卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构,表现能力…

政策及需求多因素驱动下 中国适老化改造市场空间大

政策及需求多因素驱动下 中国适老化改造市场空间大 适老化改造是为了提高老年人居住环境的舒适度和安全性,满足老年人居住需求进行的建筑改造,根据住房和城乡建设部城市建设司发布的《城市居家适老化改造指导手册》可以将适老化改造分为基础性改造和提升…

Spring Cloud 系列之Gateway:(9)初识网关

传送门 Spring Cloud Alibaba系列之nacos:(1)安装 Spring Cloud Alibaba系列之nacos:(2)单机模式支持mysql Spring Cloud Alibaba系列之nacos:(3)服务注册发现 Spring Cloud 系列之OpenFeign:(4)集成OpenFeign Spring Cloud …

【小笔记】如何在docker中更新或导入neo4j数据?

如何在docker中更新或导入neo4j数据? (1)背景: 我尝试了4.4.9和5.19.0版本的Neo4j社区版,基于他们的镜像创建容器后,需要导入我准备好的csv文件或dump文件,因为数据量非常大,所以采…

装备制造项目管理软件:奥博思PowerProject项目管理系统

数字化正逐步改变着制造方式和企业组织模式。某制造企业领导层透露,在采用数字化项目管理模式后,企业的发展韧性更加强劲,构筑起了竞争新优势,企业产品研制周期缩短25%,生产效率提升18%。 随着全球经济的发展&#xf…

北理工提出 LTrack 双摄像头系统 | 专注于暗场景多目标跟踪,自动驾驶和夜间监控的福音!

低光照场景在现实世界应用中很普遍(例如自动驾驶和夜间监控)。最近,在各种实际用例中的多目标跟踪受到了很多关注,但在暗场景中的多目标跟踪却鲜少被考虑。 在本文中,作者专注于暗场景中的多目标跟踪。为了解决数据集…

【电子学会】2023年09月图形化一级 -- 芝麻开门

芝麻开门 1. 准备工作 (1)删除小猫角色,添加角色Key; (2)删除白色背景,添加背景Castle 1和Pathway。 2. 功能实现 (1)点击绿旗,钥匙在舞台中间&#xff…

Git 的安装和使用

一、Git 的下载和安装 目录 一、Git 的下载和安装 1. git 的下载 2. 安装 二、Git 的基本使用-操作本地仓库 1 初始化仓库 1)创建一个空目录 2)git init 2 把文件添加到版本库 1)创建文件 2)git add . 3)g…

51单片机简单控制180度舵机

代码: 链接:https://pan.baidu.com/s/1K9dg2NwRhy49db_O_hqv-g?pwd1234 提取码:1234 一、路线 我在了解这个舵机之前最像想看到的是一个完全的路径。 比如我想学习b站上那个智能门锁,那就得每个模块的基本代码都会才能结合各…

​​​【收录 Hello 算法】第 10 章 搜索

目录 第 10 章 搜索 本章内容 第 10 章 搜索 搜索是一场未知的冒险,我们或许需要走遍神秘空间的每个角落,又或许可以快速锁定目标。 在这场寻觅之旅中,每一次探索都可能得到一个未曾料想的答案。 本章内容 10.1 二分查找10.2 二…

智慧展厅设计的难点有哪些

1、运用先进的展示技术 将全息影像、三维投影、虚拟现实、人机互动等技术做做完美衔接,把展厅的内容展示做到丰富多彩,从而让展厅富有科技感和艺术性。 2、内容要生动有趣 从而更好地吸引参观者。展厅设计师要与客户有良好深入的沟通,搜集与整…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt,从偏移位置offset,对b_data开始解包,返回数据格式是一个元组(v1,v2…) fmt可以有: _struct.py: The remaining chars indicate types of args and must match exactly;…