MJRefreshBackGifFooter.m 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // MJRefreshBackGifFooter.m
  3. // MJRefreshExample
  4. //
  5. // Created by MJ Lee on 15/4/24.
  6. // Copyright (c) 2015年 小码哥. All rights reserved.
  7. //
  8. #import "MJRefreshBackGifFooter.h"
  9. @interface MJRefreshBackGifFooter()
  10. @property (weak, nonatomic) UIImageView *gifView;
  11. /** 所有状态对应的动画图片 */
  12. @property (strong, nonatomic) NSMutableDictionary *stateImages;
  13. /** 所有状态对应的动画时间 */
  14. @property (strong, nonatomic) NSMutableDictionary *stateDurations;
  15. @end
  16. @implementation MJRefreshBackGifFooter
  17. #pragma mark - 懒加载
  18. - (UIImageView *)gifView
  19. {
  20. if (!_gifView) {
  21. UIImageView *gifView = [[UIImageView alloc] init];
  22. [self addSubview:_gifView = gifView];
  23. }
  24. return _gifView;
  25. }
  26. - (NSMutableDictionary *)stateImages
  27. {
  28. if (!_stateImages) {
  29. self.stateImages = [NSMutableDictionary dictionary];
  30. }
  31. return _stateImages;
  32. }
  33. - (NSMutableDictionary *)stateDurations
  34. {
  35. if (!_stateDurations) {
  36. self.stateDurations = [NSMutableDictionary dictionary];
  37. }
  38. return _stateDurations;
  39. }
  40. #pragma mark - 公共方法
  41. - (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state
  42. {
  43. if (images == nil) return;
  44. self.stateImages[@(state)] = images;
  45. self.stateDurations[@(state)] = @(duration);
  46. /* 根据图片设置控件的高度 */
  47. UIImage *image = [images firstObject];
  48. if (image.size.height > self.mj_h) {
  49. self.mj_h = image.size.height;
  50. }
  51. }
  52. - (void)setImages:(NSArray *)images forState:(MJRefreshState)state
  53. {
  54. [self setImages:images duration:images.count * 0.1 forState:state];
  55. }
  56. #pragma mark - 实现父类的方法
  57. - (void)setPullingPercent:(CGFloat)pullingPercent
  58. {
  59. [super setPullingPercent:pullingPercent];
  60. NSArray *images = self.stateImages[@(MJRefreshStateIdle)];
  61. if (self.state != MJRefreshStateIdle || images.count == 0) return;
  62. [self.gifView stopAnimating];
  63. NSUInteger index = images.count * pullingPercent;
  64. if (index >= images.count) index = images.count - 1;
  65. self.gifView.image = images[index];
  66. }
  67. - (void)placeSubviews
  68. {
  69. [super placeSubviews];
  70. if (self.gifView.constraints.count) return;
  71. self.gifView.frame = self.bounds;
  72. if (self.stateLabel.hidden) {
  73. self.gifView.contentMode = UIViewContentModeCenter;
  74. } else {
  75. self.gifView.contentMode = UIViewContentModeRight;
  76. self.gifView.mj_w = self.mj_w * 0.5 - 90;
  77. }
  78. }
  79. - (void)setState:(MJRefreshState)state
  80. {
  81. MJRefreshCheckState
  82. // 根据状态做事情
  83. if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) {
  84. NSArray *images = self.stateImages[@(state)];
  85. if (images.count == 0) return;
  86. self.gifView.hidden = NO;
  87. [self.gifView stopAnimating];
  88. if (images.count == 1) { // 单张图片
  89. self.gifView.image = [images lastObject];
  90. } else { // 多张图片
  91. self.gifView.animationImages = images;
  92. self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue];
  93. [self.gifView startAnimating];
  94. }
  95. } else if (state == MJRefreshStateIdle) {
  96. self.gifView.hidden = NO;
  97. } else if (state == MJRefreshStateNoMoreData) {
  98. self.gifView.hidden = YES;
  99. }
  100. }
  101. @end