LiveGiftLuckView.m 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. //
  2. // LiveGiftLuckView.m
  3. // MiMoLive
  4. //
  5. // Created by MiMo on 2025/2/9.
  6. //
  7. #define kLiveGiftLuckViewWidth 143.0
  8. #define kLiveGiftLuckViewHeigth 73.0
  9. #define kLiveGiftLuckNumWidth 8
  10. #define kLiveGiftLuckNumHeight 11
  11. #import "LiveGiftLuckView.h"
  12. #import "LiveGiftShowView.h"
  13. #import "LiveGiftShowModel.h"
  14. @interface LiveGiftLuckView ()<CAAnimationDelegate>
  15. @property (nonatomic, strong) UIImageView *bgLightView;
  16. @property (nonatomic, strong) UIImageView *bgImgView;
  17. @property (nonatomic, strong) UIImageView *timesImgView;
  18. @property (nonatomic, strong) UIImageView *resultImageView;
  19. @end
  20. @implementation LiveGiftLuckView
  21. - (instancetype)init {
  22. if (self = [super init]) {
  23. [self setupUI];
  24. }
  25. return self;
  26. }
  27. - (instancetype)initWithFrame:(CGRect)frame {
  28. self = [super initWithFrame:frame];
  29. if (self) {
  30. [self setupUI];
  31. }
  32. return self;
  33. }
  34. - (void)setupUI {
  35. // self.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.3];
  36. [self addSubview:self.bgLightView];
  37. [self.bgLightView mas_makeConstraints:^(MASConstraintMaker *make) {
  38. make.centerX.mas_equalTo(0);
  39. make.height.width.mas_equalTo(88);
  40. make.bottom.mas_equalTo(5);
  41. }];
  42. [self addSubview:self.bgImgView];
  43. [self.bgImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  44. make.edges.mas_equalTo(0);
  45. }];
  46. [self addSubview:self.timesImgView];
  47. [self.timesImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  48. make.centerX.mas_equalTo(0);
  49. make.bottom.mas_equalTo(-16);
  50. make.size.mas_equalTo(CGSizeMake(22, 6));
  51. }];
  52. [self addSubview:self.resultImageView];
  53. [self.resultImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  54. make.centerX.mas_equalTo(0);
  55. make.bottom.equalTo(self.timesImgView.mas_top);
  56. make.width.mas_equalTo(kLiveGiftLuckNumWidth);
  57. make.height.mas_equalTo(kLiveGiftLuckNumHeight);
  58. }];
  59. }
  60. - (void)setRtmEntity:(MORtmEntity *)rtmEntity{
  61. _rtmEntity = rtmEntity;
  62. MORtmJosnEntity *jsonData = (MORtmJosnEntity *)rtmEntity.data;
  63. if(jsonData.rebateMultiple >= 100 && jsonData.rebateMultiple <= 999){
  64. [self.bgImgView setImage:[UIImage imageNamed:@"icon_luck_mid_bg"]];
  65. [self.bgLightView setImage:[UIImage imageNamed:@"icon_luck_mid_light"]];
  66. } else if (jsonData.rebateMultiple >= 1000) {
  67. [self.bgImgView setImage:[UIImage imageNamed:@"icon_luck_big_bg"]];
  68. [self.bgLightView setImage:[UIImage imageNamed:@"icon_luck_big_light"]];
  69. } else { //小于100
  70. [self.bgImgView setImage:[UIImage imageNamed:@"icon_luck_small_bg"]];
  71. [self.bgLightView setImage:nil];
  72. }
  73. NSString *strNum = [NSString stringWithFormat:@"%zd", jsonData.rebateMultiple];
  74. NSMutableArray *resultImageArray = [NSMutableArray array];
  75. for (int i = 0; i < strNum.length; i++) {
  76. NSString *num = [strNum substringWithRange:NSMakeRange(i, 1)];
  77. UIImage *numImg = [UIImage imageNamed:[NSString stringWithFormat:@"gift_luck_times_%d", num.intValue]];
  78. if (numImg) {
  79. numImg = [UIImage scaleImage:numImg toSize:CGSizeMake(kLiveGiftLuckNumWidth, kLiveGiftLuckNumHeight)];
  80. [resultImageArray addObject:numImg];
  81. }
  82. }
  83. self.resultImageView.image = [UIImage combineImages:resultImageArray];
  84. [self.resultImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
  85. make.centerX.mas_equalTo(0);
  86. make.bottom.equalTo(self.timesImgView.mas_top);
  87. make.width.mas_equalTo(strNum.length * kLiveGiftLuckNumWidth);
  88. make.height.mas_equalTo(kLiveGiftLuckNumHeight);
  89. }];
  90. }
  91. - (void)showGiftLuckView {
  92. LiveGiftShowView *endView;
  93. UIView *giftView;
  94. for (LiveGiftShowView *view in self.endView.subviews) {
  95. if([view isKindOfClass:[LiveGiftShowView class]]){
  96. //临时View 先确定一个
  97. if([view.model.user.name isEqualToString:self.rtmEntity.user.username]){
  98. endView = view;
  99. UIView *tempGiftView = [view viewWithTag:-987654];
  100. giftView = tempGiftView;
  101. //再确定礼物也一致
  102. if(view.model.giftModel.giftData.giftCode == self.giftCode){
  103. endView = view;
  104. UIView *tempGiftView = [view viewWithTag:-987654];
  105. giftView = tempGiftView;
  106. break;
  107. }
  108. }
  109. }
  110. }
  111. if (!giftView) {
  112. return;
  113. }
  114. for (UIView *view in endView.subviews) {
  115. if([view isKindOfClass:[LiveGiftLuckView class]]){
  116. [view removeFromSuperview];
  117. }
  118. }
  119. CGPoint newCenterPoint = giftView.center;
  120. newCenterPoint = CGPointMake(newCenterPoint.x - 50, newCenterPoint.y - 5);
  121. CGFloat width = kLiveGiftLuckViewWidth;
  122. CGFloat height = kLiveGiftLuckViewHeigth;
  123. self.frame = CGRectMake(0, 0, width, height);
  124. self.center = newCenterPoint;
  125. [endView addSubview:self];
  126. CABasicAnimation *scaleUp1 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
  127. scaleUp1.fromValue = @3;
  128. scaleUp1.toValue = @1.4;
  129. scaleUp1.duration = 0.25;
  130. CABasicAnimation *scaleDown1 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
  131. scaleDown1.fromValue = @1.4;
  132. scaleDown1.toValue = @1.2;
  133. scaleDown1.beginTime = 0.25;
  134. scaleDown1.duration = 0.25;
  135. CABasicAnimation *scaleUp2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
  136. scaleUp2.fromValue = @1.2;
  137. scaleUp2.toValue = @1.4;
  138. scaleUp2.beginTime = 0.5;
  139. scaleUp2.duration = 0.25;
  140. CABasicAnimation *scaleDown2 = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
  141. scaleDown2.fromValue = @1.4;
  142. scaleDown2.toValue = @1.2;
  143. scaleDown2.beginTime = 0.75;
  144. scaleDown2.duration = 0.25;
  145. // 动画组合
  146. CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
  147. animationGroup.animations = @[scaleUp1,scaleDown1,scaleUp2,scaleDown2];
  148. animationGroup.duration = 1;
  149. // 设置动画结束后保持最终状态
  150. animationGroup.fillMode = kCAFillModeForwards;
  151. animationGroup.removedOnCompletion = NO;
  152. // 设置动画结束后代理
  153. animationGroup.delegate = self;
  154. // 将动画添加到视图的图层上
  155. [self.layer addAnimation:animationGroup forKey:@"moveAndScaleAnimation"];
  156. MORtmJosnEntity *jsonData = (MORtmJosnEntity *)self.rtmEntity.data;
  157. self.bgLightView.hidden = NO;
  158. // 创建自旋动画
  159. CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
  160. rotationAnimation.fromValue = @(0); // 起始角度
  161. rotationAnimation.toValue = @(M_PI * 2); // 终止角度
  162. rotationAnimation.duration = KTimeOutNum; // 动画持续时间
  163. rotationAnimation.repeatCount = HUGE_VALF; // 重复次数(无限循环)
  164. // 添加动画到视图的图层上
  165. [self.bgLightView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
  166. }
  167. #pragma mark - CAAnimationDelegate
  168. - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
  169. if (flag) {
  170. // 动画结束后执行的操作
  171. MOLogV(@"Animation finished");
  172. // 这里可以调用其他方法或执行其他操作
  173. [self dismiss];
  174. } else{
  175. [self dismiss];
  176. }
  177. }
  178. - (void)dismiss {
  179. [UIView animateWithDuration:0.5 animations:^{
  180. self.alpha = 0;
  181. } completion:^(BOOL finished) {
  182. if (finished) {
  183. [self removeFromSuperview];
  184. }
  185. }];
  186. }
  187. #pragma mark - Lazy
  188. - (UIImageView *)bgLightView {
  189. if (!_bgLightView){
  190. _bgLightView = [[UIImageView alloc] init];
  191. _bgLightView.contentMode = UIViewContentModeScaleAspectFill;
  192. _bgLightView.hidden = YES;
  193. }
  194. return _bgLightView;
  195. }
  196. - (UIImageView *)bgImgView {
  197. if (!_bgImgView){
  198. _bgImgView = [[UIImageView alloc] init];
  199. _bgImgView.contentMode = UIViewContentModeScaleAspectFill;
  200. }
  201. return _bgImgView;
  202. }
  203. - (UIImageView *)timesImgView {
  204. if (!_timesImgView){
  205. _timesImgView = [[UIImageView alloc] init];
  206. [_timesImgView setImage:[UIImage imageNamed:@"gift_luck_times"]];
  207. _timesImgView.contentMode = UIViewContentModeScaleAspectFill;
  208. }
  209. return _timesImgView;
  210. }
  211. - (UIImageView *)resultImageView {
  212. if (!_resultImageView) {
  213. _resultImageView = [[UIImageView alloc] init];
  214. }
  215. return _resultImageView;
  216. }
  217. @end