You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.2 KiB
82 lines
2.2 KiB
3 years ago
|
import PlaygroundSupport
|
||
|
import SwiftUI
|
||
|
|
||
|
struct PureGeniusView: View {
|
||
|
var body: some View {
|
||
|
ZStack {
|
||
|
Rectangle()
|
||
|
.fill()
|
||
|
.foregroundColor(.init(hue: 0.57, saturation: 0.25, brightness: 1))
|
||
|
Circle()
|
||
|
.frame(width: 320, height: 320)
|
||
|
.foregroundColor(.init(hue: 0.8, saturation: 0.25, brightness: 0.75))
|
||
|
VStack {
|
||
|
PGWordView(word: ["P", "U", "R", "E"]).offset(x: 0, y: 20)
|
||
|
PGWordView(word: ["G", "E", "N", "I", "U", "S"]).offset(x: 0, y: -20)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct PGWordView: View {
|
||
|
var word: [String]
|
||
|
var body: some View {
|
||
|
HStack {
|
||
|
ForEach(word.identified(by: \.self)) { letter in
|
||
|
PGLetterView(text: letter)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct PGLetterView: View {
|
||
|
var text: String
|
||
|
var body: some View {
|
||
|
ZStack {
|
||
|
MovingLetterView(text: text, color: .init(hue: 0.14, saturation: 0.56, brightness: 0.98))
|
||
|
MovingLetterView(text: text, color: .init(hue: 0.37, saturation: 0.52, brightness: 0.7))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct MovingLetterView: View {
|
||
|
var text: String
|
||
|
var color: Color
|
||
|
|
||
|
@State var position: CGPoint = .zero
|
||
|
@State var activeTimer: Timer = nil
|
||
|
|
||
|
private let animationDuration: Double = 2
|
||
|
private let maxOffset: CGFloat = 10
|
||
|
private var timer: Timer {
|
||
|
return Timer.scheduledTimer(withTimeInterval: self.animationDuration * 0.25, repeats: true) {_ in
|
||
|
let x = CGFloat(arc4random_uniform(UInt32(self.maxOffset))) - (self.maxOffset / 2)
|
||
|
let y = CGFloat(arc4random_uniform(UInt32(self.maxOffset))) - (self.maxOffset / 2)
|
||
|
self.position = CGPoint.init(x: x, y: y)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var body: some View {
|
||
|
Text(text)
|
||
|
.color(self.color)
|
||
|
.font(Font.custom("Baskerville-Bold", size: 40))
|
||
|
.bold()
|
||
|
.offset(by: self.position)
|
||
|
.animation(.basic(duration: self.animationDuration, curve: .easeInOut))
|
||
|
.onAppear {
|
||
|
self.activeTimer = self.timer
|
||
|
}
|
||
|
.onDisappear {
|
||
|
self.activeTimer = nil
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extension View {
|
||
|
public func offset(by offset: CGPoint) -> Self.Modified<_OffsetEffect> {
|
||
|
self.offset(x: offset.x, y: offset.y)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PlaygroundPage.current.liveView = UIHostingController(rootView: PureGeniusView())
|