Last active
July 23, 2024 09:56
-
-
Save greymd/ef63b62bffe00c111009b253b1471afb to your computer and use it in GitHub Desktop.
Scroll text animation in Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import PlaygroundSupport | |
class MyViewController : UIViewController { | |
var label:UILabel! | |
var label2:UILabel! | |
let gap:CGFloat = 50 | |
let rep:Float = Float.infinity | |
let shape:CAShapeLayer = { | |
return CAShapeLayer() | |
}() | |
var state:Int = 0 | |
override func viewDidLoad() { | |
self.view.backgroundColor = .white | |
shape.frame = CGRect(x: 0, y: 0, width: 200, height: 50) | |
shape.backgroundColor = UIColor.blue.cgColor | |
shape.position = CGPoint(x:view.frame.width / 2, y:view.frame.height / 2) | |
shape.masksToBounds = true | |
label = trainingItemTitleLabel(width:200, color:.green) | |
label.center = self.view.center | |
label.text = "Hello" | |
label.center = CGPoint(x:shape.frame.width / 2, y:shape.frame.height / 2) | |
label2 = trainingItemTitleLabel(width:200, color:.red) | |
label2.center = self.view.center | |
label2.text = "Hello" | |
label2.center = CGPoint(x:shape.frame.width / 2, y:shape.frame.height / 2 - gap) | |
shape.addSublayer(label.layer) | |
shape.addSublayer(label2.layer) | |
let tmp = view.layer | |
tmp.addSublayer(shape) | |
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap))) | |
} | |
@objc func handleTap() { | |
let animationPos = CABasicAnimation(keyPath: "position.y") | |
animationPos.fromValue = label.layer.position.y | |
animationPos.toValue = label.layer.position.y + gap | |
animationPos.duration = 0.5 | |
animeKeep(anim:animationPos) | |
let animationPos2 = CABasicAnimation(keyPath: "position.y") | |
animationPos2.fromValue = label2.layer.position.y | |
animationPos2.toValue = label2.layer.position.y + gap | |
animationPos2.duration = 0.5 | |
animeKeep(anim:animationPos2) | |
let mylayer = label.layer | |
let mylayer2 = label2.layer | |
if state == 0 { | |
mylayer.add(animationPos, forKey: "animationPos") | |
mylayer2.add(animationPos2, forKey: "animationPos2") | |
} else { | |
mylayer.add(animationPos2, forKey: "animationPos2") | |
mylayer2.add(animationPos, forKey: "animationPos") | |
} | |
state = 1 - state | |
} | |
func animeKeep (anim:CABasicAnimation) { | |
anim.fillMode = CAMediaTimingFillMode.forwards | |
anim.isRemovedOnCompletion = false | |
} | |
func trainingItemTitleLabel(width:CGFloat, color: UIColor) -> UILabel { | |
let label = UILabel() | |
label.text = "" | |
label.textAlignment = .center | |
label.backgroundColor = .clear | |
label.textColor = color | |
label.font = UIFont.boldSystemFont(ofSize: 50) | |
label.frame = CGRect(x: 0, y: 0, width: width, height: 50) | |
// label.center = center | |
return label | |
} | |
} | |
// Present the view controller in the Live View window | |
PlaygroundPage.current.liveView = MyViewController() |
Author
greymd
commented
Jan 21, 2020
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment