JXCategoryViewAnimator.m 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // JXCategoryViewAnimator.m
  3. // JXCategoryView
  4. //
  5. // Created by jiaxin on 2019/1/24.
  6. // Copyright © 2019 jiaxin. All rights reserved.
  7. //
  8. #import "JXCategoryViewAnimator.h"
  9. @interface JXCategoryViewAnimator ()
  10. @property (nonatomic, strong) CADisplayLink *displayLink;
  11. @property (nonatomic, assign) CFTimeInterval firstTimestamp;
  12. @property (readwrite, getter=isExecuting) BOOL executing;
  13. @end
  14. @implementation JXCategoryViewAnimator
  15. #pragma mark - Initialize
  16. - (void)dealloc {
  17. self.progressCallback = nil;
  18. self.completeCallback = nil;
  19. }
  20. - (instancetype)init {
  21. self = [super init];
  22. if (self) {
  23. _executing = NO;
  24. _duration = 0.25;
  25. _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(processDisplayLink:)];
  26. }
  27. return self;
  28. }
  29. #pragma mark - Public
  30. - (void)start {
  31. [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
  32. self.executing = YES;
  33. }
  34. - (void)stop {
  35. !self.progressCallback ?: self.progressCallback(1);
  36. [self.displayLink invalidate];
  37. !self.completeCallback ?: self.completeCallback();
  38. self.executing = NO;
  39. }
  40. - (void)invalid {
  41. [self.displayLink invalidate];
  42. !self.completeCallback ?: self.completeCallback();
  43. self.executing = NO;
  44. }
  45. #pragma mark - Actions
  46. - (void)processDisplayLink:(CADisplayLink *)sender {
  47. if (self.firstTimestamp == 0) {
  48. self.firstTimestamp = sender.timestamp;
  49. return;
  50. }
  51. CGFloat percent = (sender.timestamp - self.firstTimestamp)/self.duration;
  52. if (percent >= 1) {
  53. !self.progressCallback ?: self.progressCallback(percent);
  54. [self.displayLink invalidate];
  55. !self.completeCallback ?: self.completeCallback();
  56. self.executing = NO;
  57. }else {
  58. !self.progressCallback ?: self.progressCallback(percent);
  59. self.executing = YES;
  60. }
  61. }
  62. @end