SwiftUI小功能模块系列
0001、SwiftUI自定义Tabbar动画效果
0002、SwiftUI自定义3D动画导航抽屉效果
0003、SwiftUI搭建瀑布流-交错网格-效果
0004、SwiftUI-<探探App>喜欢手势卡片
0005、SwiftUI-粘性动画指示器引导页
0006、SwiftUI自定义引导页动画
0007、SwiftUI聚光灯介绍说明
0008、SwiftUI-自定义启动闪屏动画-App启动闪屏曲线路径动画

技术:SwiftUI、SwiftUI3.0、动画闪屏、启动动画闪屏、启动闪屏曲线路径动画、动画灵感 - 来自德国的freYfahrt打车软件
运行环境:
SwiftUI3.0 + Xcode13.4.1 + MacOS12.5 + iPhone Simulator iPhone 13 Pro Max

SwiftUI-自定义App启动闪屏曲线路径动画效果

  • 概述
  • 详细
    • 一、运行效果
    • 二、项目结构图
    • 三、程序实现 - 过程
      • 1.创建一个项目命名为 `SplashsAnimation`
      • 1.1.引入资源文件和颜色
      • 1.2 设置启动闪屏的背景颜色跟闪屏背景颜色同步
      • 2. 创建一个虚拟文件`New Group` 命名为 `View`
      • 2. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`SplashScreen`
      • 3. 创建一个文件`New File` 选择`SwiftUI View`类型 命名为`Home`
    • Code
      • ContentView - 主窗口
      • Home - 主页
      • SplashScreen - 闪屏动画页面
    • demo源码

概述

使用SwiftUI做一个App启动闪屏logo定制曲线路径的案例

详细

一、运行效果

二、项目结构图

三、程序实现 - 过程

思路:
1.创建闪屏动画页面
2.画图 画出 J 、| 、和J的倒放2个小圆点 然后控制动画
3.创建 主页 导航 + 滚动视图 + N个图片
4.处理闪屏动画结束 展示主页逻辑

1.创建一个项目命名为 SplashsAnimation


1.1.引入资源文件和颜色

颜色
SplashColor #DD8482
随机图片5张

1.2 设置启动闪屏的背景颜色跟闪屏背景颜色同步

2. 创建一个虚拟文件New Group 命名为 View


2. 创建一个文件New File 选择SwiftUI View类型 命名为SplashScreen


3. 创建一个文件New File 选择SwiftUI View类型 命名为Home

主要是: 展示 闪屏过后的首页



Code

ContentView - 主窗口

主要是展示主窗口Home和闪屏页面
一开始是闪屏页面 。闪屏动画执行完毕 就会偏移y为整个屏幕的高度。
所以首页需要判断是否动画结束完成 完成就进行一个偏移

//
//  ContentView.swift
//  Shared
//
//  Created by 李宇鸿 on 2022/8/19.
//import SwiftUIstruct ContentView: View {// 当动画完成时做动作…@State var endAnimation : Bool = falsevar body: some View {ZStack {Home()// 一开始将首页y设置为0 动画过渡完毕 就偏移到整个屏幕的高度.offset(y:endAnimation ? 0 :  getRect().height)SplashScreen(endAnimation:$endAnimation)}}
}struct ContentView_Previews: PreviewProvider {static var previews: some View {ContentView()}
}

Home - 主页

思路

  1. 主要就是展示一个导航栏 + 滚动视图 + 多张图片
//
//  Home.swift
//  SplashsAnimation (iOS)
//
//  Created by 李宇鸿 on 2022/8/19.
//import SwiftUIstruct Home: View {var body: some View {NavigationView{ScrollView(.vertical,showsIndicators: false) {VStack(spacing:20){ForEach(1...5,id:\.self){index inImage("Pic\(index)").resizable().aspectRatio(contentMode: .fit).frame(width: getRect().width - 30, height: 220).cornerRadius(15)}}.padding(15)}.navigationTitle("Trending Posts")}}
}struct Home_Previews: PreviewProvider {static var previews: some View {Home()}
}

SplashScreen - 闪屏动画页面

做法思路

  1. 画出几个图形
    J 、| 、和J的倒放2个小圆点
  2. 通过逻辑去控制每一个的动画 - 注意其中 J 、| 、和J的倒放是一个动画组
  3. 控制动画结束之后 展示首页
//
//  SplashScreen.swift
//  SplashsAnimation (iOS)
//
//  Created by 李宇鸿 on 2022/8/19.
//import SwiftUIstruct SplashScreen: View {// 动画属性……@State var startAnimation : Bool = false@State var circleAnimation1 : Bool = false@State var circleAnimation2 : Bool = false// 结束的动画@Binding var endAnimation : Boolvar body: some View {ZStack{Color("SplashColor")Group{// 自定义形状与动画…SplashShape()// 修剪.trim(from: 0, to: startAnimation ? 1 : 0)// 描边得到轮廓.stroke(Color.white,style: StrokeStyle(lineWidth: 30, lineCap: .round, lineJoin: .round))// 两个圆……Circle().fill(.white).frame(width: 35, height: 35).scaleEffect(circleAnimation1 ? 1 : 0).offset(x:-80, y: 22)Circle().fill(.white).frame(width: 35, height: 35).scaleEffect(circleAnimation2 ? 1 : 0).offset(x:80, y: -22)}// 默认尺寸.frame(width:220,height:130)// 如果是动画已经结束 就缩放到0.15倍.scaleEffect(endAnimation ? 0.15 :  0.9).rotationEffect(.init(degrees: endAnimation ? 85: 0))// 底部文案VStack{Text("Powered by").font(.callout).fontWeight(.semibold)Text("宇夜iOS").font(.title2).fontWeight(.semibold)}.frame(maxHeight:.infinity,alignment: .bottom).foregroundColor(Color.white.opacity(0.8)).padding(.bottom,getSafeArea().bottom == 0 ? 15 : getSafeArea().bottom).opacity(startAnimation ? 1 : 0).opacity(endAnimation ? 0 : 1)}// 移动视图….offset(y:endAnimation ? (-getRect().height * 1.5) : 0).ignoresSafeArea().onAppear {// 推迟开始……withAnimation(.spring().delay(0.15)){// 第一圈……circleAnimation1.toggle()}// 下一个形状……withAnimation(.interactiveSpring(response: 0.7, dampingFraction: 1.05, blendDuration: 1.05).delay(0.3)){startAnimation.toggle()}// 最后一个圆withAnimation(.spring().delay(0.7)){circleAnimation2.toggle()}// 动画结束withAnimation(.interactiveSpring(response: 0.7, dampingFraction: 1.05, blendDuration: 1.05).delay(1.2)){endAnimation.toggle()}}}
}struct SplashScreen_Previews: PreviewProvider {static var previews: some View {ContentView()}
}// 扩展视图以获得屏幕框架…
extension View{func getRect()->CGRect{return UIScreen.main.bounds}// 安全的地方func getSafeArea()->UIEdgeInsets{guard let screen = UIApplication.shared.connectedScenes.first as? UIWindowScene else{return .zero}guard let safeArea = screen.windows.first?.safeAreaInsets else{return .zero}return safeArea}
}struct SplashShape: Shape {// 画出3个路径 J | J的反转func path(in rect: CGRect) -> Path {return Path{ path inlet mid = rect.width / 2let height = rect.height// 80 = 40:弧半径…path.move(to: CGPoint(x: mid - 80, y:height))path.addArc(center: CGPoint(x: mid - 40 , y: height), radius: 40, startAngle: .init(degrees: 180), endAngle: .zero, clockwise: true)// 直线……path.move(to: CGPoint(x: mid, y: height))path.addLine(to: CGPoint(x: mid, y: 0))// 另一个弧…path.addArc(center: CGPoint(x: mid + 40 , y: 0), radius: 40, startAngle: .init(degrees: -180), endAngle: .zero, clockwise: false)}}
}

demo源码

如需看源码,请点击下载!

【SwiftUI模块】0008、SwiftUI-自定义启动闪屏动画-App启动闪屏曲线路径动画相关推荐

  1. android动画框架,GitHub - azhengyongqin/CustomAnimationFramework: Android自定义曲线路径动画框架...

    Android自定义曲线路径动画框架 最近在一个项目中需要一个像QQ打开个人爱好那样的动画效果如下图: 可以看出每个小球都是以顺时针旋转出来的,说明像这样的曲线动画用Android中自带的平移动画是很 ...

  2. android应用白屏闪退,解决 APP启动白屏黑屏问题

    闪屏页简介 闪屏页,我们手机上的每个 APP 几乎都有自己的闪屏页,就是在真正进入程序前,会有一个页面停顿几秒钟.其实我们完全可以充分利用好这几秒钟做很多的程序初始化了启动. 为什么我的 APP 启动 ...

  3. android 7.0 黑屏,Android app启动是出现白屏或者黑屏如何解决?

    1.为什么 APP 启动时会出现白屏或者黑屏? 当打开一个 Activity 时,如果这个 Activity 所属的应用还没有在运行,系统会为这个 Activity 所属的应用创建一个进程,但进程的创 ...

  4. android启动画面白屏,Android app启动时黑屏或者白屏的原因及解决办法

    1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背 ...

  5. android app启动失败,Android应用App启动白屏(黑屏)问题解决

    Android应用App启动白屏(黑屏)问题解决 点击Android手机桌面的应用App icon图标后,Android启动这个应用,正常情况下会立即看到并进入到开发者自己写在MainActivity ...

  6. linux全屏时钟应用下载,全屏时钟app下载-全屏时钟(azar Flip clock)app手机版v1.1.1-电玩之家...

    全屏时钟是一款有趣的时钟软件,全屏时钟支持安卓和ios,任何手机机型均可使用.全屏时钟是款趣味时钟软件,它支持全屏时钟显示功能.全屏时钟支持动画自定义设置功能,让手机屏幕变得与众不同.感兴趣的用户们快 ...

  7. app息屏后ajax请求不执行_息屏时钟app下载-息屏时钟软件下载v1.0 安卓版

    息屏时钟app是一款息屏后可以在手机上显示各种时间的app,软件中可以感受全新的主题桌面,美化手机屏幕,不需要唤醒手机也能查看时间,软件的功能众多,还可以设置不同的息屏画面,超多内容可以体验,快来试试 ...

  8. 分析启动耗时 android,Android app启动耗时分析

    首先编译你的程序,打开Android Studio里面的Android Monitor,找到下图的按钮 <img src="//bbsm ...

  9. android 签名包闪退,解决APP连续闪退的方案,你还不知道的签名方式

    原标题:解决APP连续闪退的方案,你还不知道的签名方式 用户在使用APP检测到连续闪退后,接下来要尝试对闪退进行修复,这里先分析可能的闪退原因: 闪退原因 连续闪退,可能是 App 启动关键路径中执行 ...

最新文章

  1. 详解ABBYY FineReader 12扫描亮度设置
  2. CommonJs模块规范
  3. 还有多少时间可以用来读书
  4. CentoS8 Mysql8 数据目录迁移
  5. 【玩转树莓派】使用 sinopia 搭建私有 npm 服务器
  6. linux apache添加多站点配置(Ubuntn和Centos)
  7. STM32f4 ARM Bootloader
  8. 【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)
  9. CSS如何实现两个a标签元素的文字一个靠左一个靠右,并且能点击分别不同的链接
  10. JavaScript 中的 window onload 应该什么时候写
  11. mysql .pdb是什么文件_超详细讲解如何使用 pdb 在服务器上调试代码
  12. 利用jsonp实现跨域请求
  13. Xocde一次版本升级遇到的问题 (Code Sign Error)
  14. 如何使用Java代码获取Android移动终端Mac地址
  15. 用java求解八枚银币问题_算法笔记_004:8枚硬币问题【减治法】
  16. 关于DllRegisterServer的调用失败的问题解决办法
  17. 基恩士PLC⑤--Fault程序实例笔记
  18. oracle的安装(因为oracle版本安装各有差异,今天先讲最简单的安装,至于每个版本的具体安装度妈会讲,下一章同样会介绍可视化工具)
  19. win10使用VMware Workstations安装CentOS
  20. c语言 10行帕斯卡三角形,C语言帕斯卡三角形打印示例

热门文章

  1. 网页爬虫之二手车价格爬虫
  2. python缩进快捷键 gvim_vim python缩进问题 - 卡饭网
  3. ABAP SORT排序注意点
  4. 1h-8学习(1):1h-8适配之int8直接量化+转.cambricon格式
  5. oppo r11 android版本,OPPO R11有哪些版本_OPPO R11内存多大-太平洋IT百科
  6. 答案解析(C语言版本)——第五届“传智杯”全国大学生计算机大赛(练习赛)
  7. imovie for Mac(高级视频剪辑软件)
  8. 如何使用损坏的电源按钮锁定iPhone 或 iPad?
  9. iview的树形控件的使用 尤其是点击文字展开子节点的方法
  10. ASP.ENT C#生成excl表格