Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 KB | None | 0 0
  1. //
  2. // CADisplayLinkBinding.swift
  3. // lingq-5
  4. //
  5. // Created by Timothy Costa on 2019/07/11.
  6. // Copyright © 2019 timothycosta.com. All rights reserved.
  7. //
  8.  
  9. import Combine
  10. import SwiftUI
  11.  
  12. class CADisplayLinkBinding: NSObject, BindableObject {
  13.  
  14. let didChange = PassthroughSubject<CADisplayLinkBinding, Never>()
  15. private(set) var progress: Double = 0.0
  16.  
  17. private(set) var startTime: CFTimeInterval = 0.0
  18. private(set) var duration: CFTimeInterval = 0.0
  19. private(set) lazy var displayLink: CADisplayLink = {
  20. let link = CADisplayLink(target: self, selector: #selector(tick))
  21. link.add(to: .main, forMode: .common)
  22. link.isPaused = true
  23. return link
  24. }()
  25.  
  26. func run(for duration: CFTimeInterval) {
  27. let now = CACurrentMediaTime()
  28. self.progress = 0.0
  29. self.startTime = now
  30. self.duration = duration
  31. self.displayLink.isPaused = false
  32. }
  33.  
  34. @objc private func tick() {
  35. let elapsed = CACurrentMediaTime() - self.startTime
  36. self.progress = min(1.0, elapsed / self.duration)
  37. self.displayLink.isPaused = self.progress >= 1.0
  38. self.didChange.send(self)
  39. }
  40.  
  41. deinit {
  42. self.displayLink.invalidate()
  43. }
  44.  
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement