JXCategoryViewAnimator.m 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. - (void)dealloc
  16. {
  17. self.progressCallback = nil;
  18. self.completeCallback = nil;
  19. }
  20. - (instancetype)init
  21. {
  22. self = [super init];
  23. if (self) {
  24. _executing = NO;
  25. _duration = 0.25;
  26. _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(processDisplayLink:)];
  27. }
  28. return self;
  29. }
  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. - (void)processDisplayLink:(CADisplayLink *)sender {
  46. if (self.firstTimestamp == 0) {
  47. self.firstTimestamp = sender.timestamp;
  48. return;
  49. }
  50. CGFloat percent = (sender.timestamp - self.firstTimestamp)/self.duration;
  51. if (percent >= 1) {
  52. !self.progressCallback ?: self.progressCallback(percent);
  53. [self.displayLink invalidate];
  54. !self.completeCallback ?: self.completeCallback();
  55. self.executing = NO;
  56. }else {
  57. !self.progressCallback ?: self.progressCallback(percent);
  58. self.executing = YES;
  59. }
  60. }
  61. @end