【SwiftUI模块】0033、SwiftUI创建用户双击帖子时的心形动画
SwiftUI模块系列 - 已更新33篇
SwiftUI项目 - 已更新3个项目
往期Demo源码下载
技术:SwiftUI、SwiftUI4.0、双击动画、心形动画、动画
运行环境:
SwiftUI4.0 + Xcode14 + MacOS12.6 + iPhone Simulator iPhone 14 Pro Max
SwiftUI创建用户双击帖子时的心形动画
- 概述
- 详细
- 一、运行效果
- 二、项目结构图
- 三、程序实现 - 过程
- 1.创建一个项目命名为 `SpotifyResponvieUI`
- 1.1.引入资源文件和颜色
- 2. 创建一个虚拟文件`New Group` 命名为 `View`
- 3. 创建一个虚拟文件`New Group` 命名为 `Model`
- 4. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`Post` 删除预览图 并且继承`Identifiable` 作为模型
- 5. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`Home`
- Code
- ContentView - 主窗口
- Home - 主页
- Post - 模型
概述
使用SwiftUI创建用户双击帖子时的心形动画
详细
一、运行效果
二、项目结构图
三、程序实现 - 过程
思路:
- 构建列表滚动模块 - 使用ScrollView搭建
- 构建双击心形动画 HeartLike -
封装起来 包含点击的次数、是否点击、背景动画、是否重置动画、是否烟花动画、动画是否结束、动画是否完成等参数
1.创建一个项目命名为 SpotifyResponvieUI
1.1.引入资源文件和颜色
无
2. 创建一个虚拟文件New Group
命名为 View
3. 创建一个虚拟文件New Group
命名为 Model
4. 创建一个文件New File
选择SwiftUI View
类型 命名为Post
删除预览图 并且继承Identifiable
作为模型
5. 创建一个文件New File
选择SwiftUI View
类型 命名为Home
主要是:
展示
列表视图 和 双击时的心形烟花释放动画
Code
ContentView - 主窗口
主要是展示主窗口
Home
//
// ContentView.swift
// LikedAnimation
//
// Created by 李宇鸿 on 2022/9/27.
//import SwiftUIstruct ContentView: View {var body: some View {Home()}
}struct ContentView_Previews: PreviewProvider {static var previews: some View {ContentView()}
}
Home - 主页
思路
- 构建列表滚动模块 - 使用ScrollView搭建
- 构建双击心形动画 HeartLike -
封装起来 包含点击的次数、是否点击、背景动画、是否重置动画、是否烟花动画、动画是否结束、动画是否完成等参数
//
// Home.swift
// LikedAnimation
//
// Created by 李宇鸿 on 2022/9/27.
//import SwiftUIstruct Home: View {// @State var posts : [Post] = [Post(imageName: "Pic1"),Post(imageName: "Pic2"),Post(imageName: "Pic3"),Post(imageName: "Pic4"),Post(imageName: "Pic5"),]var body: some View {NavigationView{ScrollView(.vertical,showsIndicators: false) {VStack(alignment: .leading,spacing:16) {ForEach(posts){post inVStack(alignment: .leading,spacing: 12) {GeometryReader{proxy inImage(post.imageName).resizable().aspectRatio(contentMode: .fill).cornerRadius(15)}.frame(height:280).overlay(HeartLike(isTapped:$posts[getIndex(post: post)].isLiked,taps: 2)).cornerRadius(15)Button {posts[getIndex(post: post)].isLiked.toggle()} label: {Image(systemName: post.isLiked ? "suit.heart.fill" : "suit.heart").font(.title2).foregroundColor(post.isLiked ? .red : .gray)}}}}.padding()}.navigationTitle("Heart Animation")}}// 获取索引func getIndex(post : Post)-> Int {let index = posts.firstIndex{ currentPost inreturn currentPost.id == post.id} ?? 0return index}
}struct Home_Previews: PreviewProvider {static var previews: some View {ContentView()}
}struct HeartLike:View {// 在弹出的菜单动画……@Binding var isTapped : Bool@State var startAnimation = false@State var bgAnimation = false// 重置Bg……@State var resetBG = false// 烟花动画@State var fireworkAnimation = false// 动画是否结束@State var animationEnded = false// 避免在动画中轻拍…@State var tapComplete = false// 设置多少次点击…var taps : Int = 1var body: some View {// 心如动画……Image(systemName: resetBG ? "suit.heart.fill" : "suit.heart").font(.system(size: 45)).foregroundColor(resetBG ? .red : .gray)// 扩展…….scaleEffect(startAnimation && !resetBG ? 0 : 1).opacity(startAnimation && !animationEnded ? 1 : 0).background(ZStack{CustomShape(radius: resetBG ? 29 : 0).fill(Color.purple).clipShape(Circle())// Fixed Size.frame(width:50,height:50).scaleEffect(bgAnimation ? 2.2 : 0)ZStack{// 烟花的随机颜色let colors : [Color] = [.red,.purple,.green,.yellow,.pink]ForEach(1...6,id:\.self){ index inCircle().fill(colors.randomElement()!).frame(width: 8,height: 8).offset(x: fireworkAnimation ? 64 : 24).rotationEffect(.init(degrees: Double(index) * 60))}ForEach(1...6,id:\.self){ index inCircle().fill(colors.randomElement()!).frame(width: 12,height: 12).offset(x: fireworkAnimation ? 80 : 40).rotationEffect(.init(degrees: Double(index) * 60)).rotationEffect(.init(degrees: -45))}}.opacity(resetBG ? 1 : 0).opacity(animationEnded ? 0 : 1)}).frame(maxWidth: .infinity,maxHeight: .infinity,alignment: .center).contentShape(Rectangle()).onTapGesture(count:taps) {if tapComplete{updateFields(value: false)return}// 动画正在执行 就不执行if startAnimation {return}isTapped = truewithAnimation(.interactiveSpring(response: 0.5,dampingFraction: 0.6,blendDuration: 0.6)){startAnimation = true}// 顺列动画……// 链动画……DispatchQueue.main.asyncAfter(deadline: .now() + 0.25){withAnimation(.interactiveSpring(response: 0.4,dampingFraction: 0.5,blendDuration: 0.5)){bgAnimation = true}DispatchQueue.main.asyncAfter(deadline: .now() + 0.3){withAnimation(.interactiveSpring(response: 0.5,dampingFraction: 0.6,blendDuration: 0.6)){resetBG = true}// 烟花……withAnimation(.spring()) {fireworkAnimation = true}DispatchQueue.main.asyncAfter(deadline: .now() + 0.4){withAnimation(.easeOut(duration: 0.4)) {animationEnded = true}DispatchQueue.main.asyncAfter(deadline: .now() + 0.3){tapComplete = true}}}}}.onChange(of: isTapped) { newValue inif isTapped && !startAnimation {// 设置一切为真…updateFields(value: true)}}}// 更新动画字段func updateFields(value: Bool){startAnimation = valuebgAnimation = valueresetBG = valuefireworkAnimation = valueanimationEnded = valuetapComplete = valueisTapped = value}
}//自定义形状
//从中心重置…
struct CustomShape : Shape {// value...var radius : CGFloat// 动画路径…var animatableData: CGFloat{get {return radius}set {radius = newValue}}// 可动画路径在预览时无效func path(in rect: CGRect) -> Path {return Path {path inpath.move(to: CGPoint(x: 0, y: 0))path.addLine(to: CGPoint(x: 0, y: rect.height))path.addLine(to: CGPoint(x: rect.width, y: rect.height))path.addLine(to: CGPoint(x: rect.width, y: 0))// 增加中心圆……let center = CGPoint(x: rect.width / 2, y: rect.height / 2)path.move(to: center)path.addArc(center: center, radius: radius, startAngle: .zero, endAngle: .init(degrees: 360), clockwise:false)}}
}
Post - 模型
//
// Post.swift
// LikedAnimation
//
// Created by 李宇鸿 on 2022/9/27.
//import SwiftUI// Post Model...
struct Post : Identifiable {var id = UUID().uuidStringvar imageName : Stringvar isLiked : Bool = false}
【SwiftUI模块】0033、SwiftUI创建用户双击帖子时的心形动画相关推荐
- 纯CSS创建心形翻转动画
首先,需要创建一个元素,代码如下 <!DOCTYPE html> <html> <meta charset="utf-8"><head&g ...
- 【SwiftUI模块】0056、SwiftUI创建时尚的电影预订应用程序UI
SwiftUI模块系列 - 已更新56篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI4.0.电影.电影预定.订票 运行环境: SwiftUI4. ...
- 【SwiftUI模块】0007、SwiftUI新手指引-新手指示-聚光灯介绍说明
SwiftUI小功能模块系列 0001.SwiftUI自定义Tabbar动画效果 0002.SwiftUI自定义3D动画导航抽屉效果 0003.SwiftUI搭建瀑布流-交错网格-效果 0004.Sw ...
- 【SwiftUI模块】0004、SwiftUI-<探探App>喜欢手势卡片
SwiftUI小功能模块系列 0001.SwiftUI自定义Tabbar动画效果 0002.SwiftUI自定义3D动画导航抽屉效果 0003.SwiftUI搭建瀑布流-交错网格-效果 0004.Sw ...
- python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)...
昨日内容回顾 外键的变种三种关系:多对一:左表的多 对右表一 成立左边的一 对右表多 不成立foreign key(从表的id) refreences 主表的(id)多对多建立第三张表(foreign ...
- 【SwiftUI模块】0012、SwiftUI-搭建一个类似微博、网易云、抖音个人页面的头部下拉放大图片效果
SwiftUI模块系列 - 已更新11篇 SwiftUI项目 - 已更新1个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI3.0.下拉放大.tableview粘性头部.头部下拉放大图 ...
- 【SwiftUI模块】0018、SwiftUI搭建一个类似支付宝中的余额宝余额数字动画效果
SwiftUI模块系列 - 已更新18篇 SwiftUI项目 - 已更新1个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI3.0.支付宝.余额宝.数字动画 运行环境: SwiftUI ...
- 【SwiftUI模块】0032、SwiftUI搭建一个类似抖音评论模块的半页模式 - 底部抽屉
SwiftUI模块系列 - 已更新32篇 SwiftUI项目 - 已更新3个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI4.0.抖音评论.半页模式.底部抽屉 运行环境: Swift ...
- 【SwiftUI模块】0013、SwiftUI搭建-类似蚂蚁财富的基金累计盈亏的走势图
SwiftUI模块系列 - 已更新13篇 SwiftUI项目 - 已更新1个项目 往期Demo源码下载 技术:SwiftUI.SwiftUI3.0.基金.走势图.蚂蚁财富 运行环境: SwiftUI3 ...
最新文章
- Git + BeyondCompare
- iOS开发-Xcode入门ObjC程序
- 日期函数:取过去或者将来多少天的日期
- STM32 之十四 System Memory、Bootloader
- Photon多人游戏开发教程
- JS面试之对象(2)
- Spring4.x()--Spring的Jdbc事务-零配置
- 我设想的可扩展结构(插件) (二)
- C++ 内存分配(new,operator new)详解
- 设置idea类注释模板
- STM32F103C8T6全桥逆变电路PWM波生成(基于HAL库)
- RIM任松伟:黑莓引领企业移动化主题演讲
- GEE开发之Modis_LST地表温度数据分析
- 【IoT】 产品设计之α、β、λ测试
- oracle存储超长文本
- EVE模拟器如何设置预配
- 研华板卡1742U--瞬时读值 用 instantAiCtrl1 控件
- 爽啊,这么多有趣好玩强大的 Python 库
- 俄罗斯DST收购ICQ;苹果收购芯片提供商(每日关注20100428)
- 初步分析 flash to html5 convert in Flash CS6
热门文章
- 部署keepalive+lvs多master节点高可用
- [BZOJ4763][P3603]雪辉[手写bitset+静态分块]
- 狂神说Java--Java学习笔记(基础合集)
- Mac电脑使用:Mac电脑查看本机的IP和公网IP的方法
- 阿里云使用笔记(一):从零开始配置阿里云GPU服务器训练深度学习模型
- 论文笔记:Show, Control and Tell:A Framework for Generating Controllable and Grounded Captions
- 小程序报错invalid code解决办法
- 2018科大讯飞Java笔试第三道编程题
- 入门到放弃之 NVMe-MI --- 协议简介
- 电商全平台订单管理OMS系统