-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathDNALoading.swift
More file actions
144 lines (128 loc) · 5.3 KB
/
DNALoading.swift
File metadata and controls
144 lines (128 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//
// DNALoading.swift
// InstagramAnimation
//
// Created by InnAppsCoding on 14/08/2020.
// Copyright © 2020 InnAppsCoding. All rights reserved.
//
import SwiftUI
let firstC = Color(UIColor(red: 0.57, green: 0.92, blue: 0.94, alpha: 1.00))
let secondC = Color(UIColor(red: 0.50, green: 0.50, blue: 0.87, alpha: 1.00))
let firstC1 = Color(UIColor(red: 0.92, green: 0.69, blue: 0.81, alpha: 1.00))
let secondC2 = Color(UIColor(red: 0.40, green: 0.31, blue: 0.69, alpha: 1.00))
struct DNALoading: View {
@State private var top: Bool = false
var body: some View {
HStack(spacing: self.spacing) {
ForEach(0..<self.numberOfBalls, id: \.self) { i in
DNABalls(delay: (Double(i)/4),
ballSpeed: self.ballSpeed,
ballSize: self.ballSize,
firstBallColor: self.firstBallColor,
secondBallColor: self.secondBallColor)
.frame(width: self.ballSize, height: self.frameHeight)
}
}
.onAppear() {
Timer.scheduledTimer(withTimeInterval: self.ballSpeed, repeats: true) { _ in
self.top.toggle()
}
}
}
// MARK: - Drawing Constents
let numberOfBalls: Int = 5
let spacing: CGFloat = 20
let ballSpeed: Double = 0.75
let ballSize: CGFloat = 30
let frameHeight: CGFloat = 60
let firstBallColor: LinearGradient = LinearGradient(gradient: Gradient(colors: [firstC, secondC]), startPoint: .top, endPoint: .bottom)
let secondBallColor: LinearGradient = LinearGradient(gradient: Gradient(colors: [firstC1, secondC2]), startPoint: .top, endPoint: .bottom)
}
struct DNALoading_Previews: PreviewProvider {
static var previews: some View {
DNALoading()
}
}
struct DNABalls: View {
@State var delay: Double
@State var ballSpeed: Double
@State var ballSize: CGFloat
@State var firstBallColor: LinearGradient
@State var secondBallColor: LinearGradient
@State private var top = false
var body: some View {
GeometryReader() { geo in
ZStack {
ZStack {
DNABall(delay: 0 + self.delay, ballSpeed: self.ballSpeed, ballSize: self.ballSize, rect: geo.size, color: self.firstBallColor)
DNABall(delay: self.ballSpeed + self.delay, ballSpeed: self.ballSpeed, ballSize: self.ballSize, rect: geo.size, color: self.secondBallColor)
}
.opacity(self.top ? 1 : 0)
ZStack {
DNABall(delay: self.ballSpeed + self.delay, ballSpeed: self.ballSpeed, ballSize: self.ballSize, rect: geo.size, color: self.secondBallColor)
DNABall(delay: 0 + self.delay, ballSpeed: self.ballSpeed, ballSize: self.ballSize, rect: geo.size, color: self.firstBallColor)
}
.opacity(self.top ? 0 : 1)
}
}
.onAppear() {
DispatchQueue.main.asyncAfter(deadline: .now() + self.delay) {
Timer.scheduledTimer(withTimeInterval: self.ballSpeed, repeats: true) { _ in
self.top.toggle()
}
}
}
}
}
struct DNABalls_Previews: PreviewProvider {
static var previews: some View {
DNABalls(delay: 0,
ballSpeed: 1,
ballSize: 30,
firstBallColor: LinearGradient(gradient: Gradient(colors: [firstC, secondC]), startPoint: .top, endPoint: .bottom),
secondBallColor: LinearGradient(gradient: Gradient(colors: [firstC1, secondC2]), startPoint: .top, endPoint: .bottom)
)
.frame(width: 30, height: 100)
}
}
struct DNABall: View {
@State var delay: Double
@State var ballSpeed: Double
@State var ballSize: CGFloat
@State var rect: CGSize
@State var color: LinearGradient
@State private var offsetY: CGFloat = 0
@State private var scale: CGFloat = 1
var body: some View {
Circle()
.fill(color)
.frame(width: self.ballSize, height: self.ballSize)
.offset(x: 0, y: -(rect.height/2))
.offset(x: 0, y: self.offsetY)
.scaleEffect(self.scale)
.onAppear() {
DispatchQueue.main.asyncAfter(deadline: .now() + self.delay) {
withAnimation(Animation.easeInOut(duration: self.ballSpeed).repeatForever(autoreverses: true)) {
self.offsetY = self.rect.height
}
DispatchQueue.main.asyncAfter(deadline: .now() + self.ballSpeed/2) {
withAnimation(Animation.easeInOut(duration: self.ballSpeed).repeatForever(autoreverses: true)) {
self.scale = self.minBallScale
}
}
}
}
}
// MARK: - Drawing Constents
let minBallScale: CGFloat = 0.65
}
struct DNABall_Previews: PreviewProvider {
static var previews: some View {
DNABall(delay: 0,
ballSpeed: 1,
ballSize: 30,
rect: CGSize(width: 50, height: 100),
color: LinearGradient(gradient: Gradient(colors: [firstC, secondC]), startPoint: .top, endPoint: .bottom)
)
}
}