Skip to content

Instantly share code, notes, and snippets.

@AlexanderBollbach
Created September 29, 2019 16:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlexanderBollbach/73e60dc00cd3a6b75a6d9bfb29593a59 to your computer and use it in GitHub Desktop.
Save AlexanderBollbach/73e60dc00cd3a6b75a6d9bfb29593a59 to your computer and use it in GitHub Desktop.
class AnimatingFramedView: UIView {
var isPaused = false
private var timer: Timer?
private lazy var viewFrameUpdater = RealTimeViewUpdator(delegate: self)
var tick = 0
let imageView = UIImageView()
init(defaultFrameRate: Int) {
super.init(frame: .zero)
imageView.pinTo(superView: self)
set(framerate: defaultFrameRate)
}
required init?(coder aDecoder: NSCoder) { fatalError() }
func set(framerate: Int) {
timer?.invalidate()
timer = Timer.scheduledTimer(
timeInterval: 1 / Double(framerate),
target: viewFrameUpdater,
selector: #selector(RealTimeViewUpdator.update),
userInfo: nil,
repeats: true
)
timer?.tolerance = 0.001
}
func newFrame() {
nextTick()
if isPaused { return }
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let image = self?.frameProvider() else { return }
DispatchQueue.main.async {
self?.imageView.image = image
}
}
}
private func nextTick() {
tick = tick + 1 >= 100 ? 0 : tick + 1
}
func frameProvider() -> UIImage? { fatalError("override me") }
}
extension AnimatingFramedView: ViewFrameUpdatorDelegate {
func frameUpdated() { newFrame() }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment