Skip to content

Instantly share code, notes, and snippets.

@jwamin
Last active December 19, 2023 03:26
Show Gist options
  • Save jwamin/5a3153f00fae86b10e5ec107d2368156 to your computer and use it in GitHub Desktop.
Save jwamin/5a3153f00fae86b10e5ec107d2368156 to your computer and use it in GitHub Desktop.
watchOS "Breathe" Animation
import UIKit
import PlaygroundSupport
var str = "Hello, playground"
class ViewController : UIViewController {
var breatheView: BreatheView {
self.view as! BreatheView
}
override func loadView() {
self.view = BreatheView()
}
override func viewDidLoad() {
print("View LOADED")
view.backgroundColor = .black
}
}
class BreatheView : UIView {
let parentSublayer: CALayer
let shapeLayers:[CAShapeLayer]
let petals: Int = 5
override init(frame: CGRect) {
parentSublayer = CALayer()
var shapeLayers = Array<CAShapeLayer>()
for _ in 0...petals{
let shapeLayer = BreatheShapeLayer()
shapeLayers.append(shapeLayer)
shapeLayer.frame = CGRect(origin: .zero, size: CGSize(width: 20, height: 20))
}
self.shapeLayers = shapeLayers
super.init(frame: frame)
for layer in self.shapeLayers{
parentSublayer.addSublayer(layer)
}
self.layer.addSublayer(parentSublayer)
let rotation = CABasicAnimation(keyPath: "transform")
rotation.fromValue = CATransform3DIdentity
rotation.toValue = CATransform3DRotate(CATransform3DIdentity, 6.283185 / 6 , 0, 0, 1)
rotation.duration = 5
rotation.autoreverses = true
rotation.repeatCount = .infinity
parentSublayer.add(rotation, forKey: "rotation")
let threesixty = 6.283185
let angle = threesixty / Double(shapeLayers.count)
for (index,layer) in shapeLayers.enumerated() {
let angle: CGFloat = CGFloat(index) * CGFloat(angle)
//still need set adjusted color according to angle / index...
//layer.fillColor
print(angle)
let positionAnimation = CABasicAnimation(keyPath: "transform")
positionAnimation.fromValue = CATransform3DIdentity
var matrix = CATransform3DTranslate(CATransform3DIdentity, -10, 0, 0)
let rotation = CATransform3DRotate(CATransform3DIdentity, angle, 0, 0, 1)
matrix = CATransform3DConcat(matrix, rotation)
let scale = CATransform3DScale(CATransform3DIdentity, 4, 4, 1)
matrix = CATransform3DConcat(matrix, scale)
positionAnimation.toValue = matrix
positionAnimation.duration = 5
positionAnimation.autoreverses = true
positionAnimation.repeatCount = .infinity
layer.add(positionAnimation, forKey: "position")
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSublayers(of layer: CALayer) {
parentSublayer.frame = CGRect(origin: .zero, size: CGSize(width: self.bounds.width, height: self.bounds.width))
for layer in self.shapeLayers{
layer.position = parentSublayer.position
}
parentSublayer.position = self.center
}
}
class BreatheShapeLayer : CAShapeLayer {
override var bounds: CGRect {
didSet{
self.path = UIBezierPath(ovalIn: bounds).cgPath
}
}
override init() {
super.init()
self.fillColor = #colorLiteral(red: 0.2908082902, green: 0.7886607051, blue: 0.6428668499, alpha: 1)
self.opacity = 0.5
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
PlaygroundPage.current.liveView = ViewController()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment