SwiftUI动画进阶,仿购票平台App行程目的地互换动效

简介: SwiftUI动画进阶,仿购票平台App行程目的地互换动效

SwiftUI动画进阶,仿购票平台App行程目的地互换动效


项目背景

近几个月经常在国内出差,往常都是HR帮忙订好的机票和酒店,某天在打开某团搜索行程的时候发现地址切换动画蛮有意思。

当我们需要快捷切换出发地目的地时,只需要点击中间的切换按钮,然后就会有一个出发地和目的地“文字对调”的动画,这很人性化,也很优雅。

本章中,我们就来使用MatchedGeometryEffect构建这样的过渡动画。

那么,让我们开始吧。

项目搭建

首先,创建一个新的SwiftUI项目,命名为SwiftUIMGE

image.png

基础样式

先来看看基础样式部分,基础的结构我们可以看到有3个元素:起始地切换图标目的地

三个元素横向排布,我们先来完成下基础的样式,示例:

HStack {
    Spacer()
    Text("广州")
        .font(.title)
        .fontWeight(.bold)
        .foregroundColor(.black)
    Spacer()
    Image(systemName: "paperplane.circle")
        .foregroundColor(.red)
        .font(.title)
    Spacer()
    Text("北京")
        .font(.title)
        .fontWeight(.bold)
        .foregroundColor(.black)
    Spacer()
}
.frame(maxWidth: .infinity)
.padding()

上述代码中,我们使用HStack横向布局视图,使用Spacer将3个元素均衡分布。

基础动画

当我们点击中间的按钮时,需要对调出发地和目的地的位置,我们先声明一个变量表示当前的状态,示例:

@State var isSwitch: Bool = true

isSwitch处于不同状态时,我们展示不同的视图,同时在点击Image图标时,切换isSwitch的状态。

if isSwitch {
    HStack {
        Spacer()
        Text("广州")
            .font(.title)
            .fontWeight(.bold)
            .foregroundColor(.black)
        Spacer()
        Image(systemName: "paperplane.circle")
            .foregroundColor(.red)
            .font(.title)
            .onTapGesture {
                withAnimation(.linear) {
                    self.isSwitch.toggle()
                }
            }
        Spacer()
        Text("北京")
            .font(.title)
            .fontWeight(.bold)
            .foregroundColor(.black)
        Spacer()
    }
    .frame(maxWidth: .infinity)
    .padding()
} else {
    HStack {
        Spacer()
        Text("北京")
            .font(.title)
            .fontWeight(.bold)
            .foregroundColor(.black)
        Spacer()
        Image(systemName: "paperplane.circle")
            .foregroundColor(.red)
            .font(.title)
            .onTapGesture {
                withAnimation(.linear) {
                    self.isSwitch.toggle()
                }
            }
        Spacer()
        Text("广州")
            .font(.title)
            .fontWeight(.bold)
            .foregroundColor(.black)
        Spacer()
    }
    .frame(maxWidth: .infinity)
    .padding()
}

过渡动画

上述代码中,我们根据isSwitch的状态切换两个视图,实现了基础的动画效果,但这不够优雅。

我们看到客户端的过渡动画是两个文字有一个优雅的“互调过渡”,我们先声明一个变量来存储交换位置的状态,示例:

@Namespace private var Transition

然后使用matchedGeometryEffect修饰符进行位置变换,示例:

//广州的id为guangzhou
Text("广州")
    .matchedGeometryEffect(id: "guangzhou", in: Transition)
//北京的id为beijing
Text("北京")
     .matchedGeometryEffect(id: "beijing", in: Transition)

image.png

我们给4个Text都加上matchedGeometryEffect修饰符,这里要区分ID,过渡动画才能知道那两个视图的元素进行交换。

这里如果我们要看到最终的效果,我们需要运行模拟器,在真机环境下才能看到最终的交互效果。

项目预览

image.png

恭喜你,完成了本章的全部内容!

快来动手试试吧。

相关文章
|
8月前
|
传感器 人工智能 监控
Uni-app智慧工地数据大屏可视化监管平台源码带APP
智慧工地的核心是数字化,它通过传感器、监控设备、智能终端等技术手段,实现对工地各个环节的实时数据采集和传输,如环境温度、湿度、噪音等数据信息,将数据汇集到云端进行处理和分析,生成各种报表、图表和预警信息,帮助管理人员了解工地的实时状况,及时做出决策和调整,
199 0
|
8月前
|
人工智能 监控 安全
java基于微服务架构的智慧工地监管平台源码带APP
劳务管理: 工种管理、分包商管理、信息采集、班组管理、花名册、零工采集、 现场统计、考勤管理、考勤明细、工资管理、零工签证
323 4
|
8月前
|
人工智能 监控 数据可视化
Java智慧工地可视化APP信息管理平台源码
利用物联网、云计算等先进信息化技术手段,实时掌握施工工地全方位的现场情况,提高数据获取的准确性、及时性、真实性和响应速度。
95 3
|
9天前
|
前端开发 算法 安全
一站式搭建相亲交友APP丨交友系统源码丨语音视频聊天社交软件平台系统丨开发流程步骤
本文详细介绍了一站式搭建相亲交友APP的开发流程,涵盖需求分析、技术选型、系统设计、编码实现、测试、部署上线及后期维护等环节。通过市场调研明确平台定位与功能需求,选择适合的技术栈(如React、Node.js、MySQL等),设计系统架构和数据库结构,开发核心功能如用户注册、匹配算法、音视频聊天等,并进行严格的测试和优化,确保系统的稳定性和安全性。最终,通过云服务部署上线,并持续维护和迭代,提供一个功能完善、安全可靠的社交平台。
72 6
|
17天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
53 3
为什么不加盟线下陪玩APP小程序平台,而是自建平台?
自建线下陪玩APP平台相比加盟,能避免利润抽成,确保所有收益归己,同时提供更高的运营灵活性和稳定性,不受制于合同限制或总平台决策变动,更适合追求长期发展的创业者。
|
7月前
|
前端开发 小程序
新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码
同城校园跑腿外卖配送平台源码,支持自定义diy 你可以设计你的页面,设计你自己的风格,支持多校园,独立版本,多商户,有用户端,骑手端,商家端,强大的功能
213 3
|
8月前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
70 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
|
8月前
|
前端开发 Android开发 iOS开发
应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
【2月更文挑战第31天】应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
137 2
游戏直播APP平台开发多少钱成本:定制与成品源码差距这么大
开发一款游戏直播APP平台所需的费用是多少?对于计划投身这一领域的投资者来说,首要关心的问题之一就是。本文将探讨两种主要的开发模式——定制开发与成品源码二次开发的成本差异及其优劣势。