MOLikeAnimation.m 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. //
  2. // MOLikeAnimation.m
  3. //
  4. #import "MOLikeAnimation.h"
  5. #import "MOShowRoomLiveView.h"
  6. #import "MOClickNumView.h"
  7. #import "MOClickConfigManager.h"
  8. //---------------------------------------------私有定制·配置区
  9. /** ❤️形图片的名字*/
  10. NSString *const mo_heartImgName = @"icon_click_";
  11. /** ❤️形图片的宽度*/
  12. const CGFloat mo_heartImgWidth = 50;
  13. /** ❤️形图片的高度*/
  14. const CGFloat mo_heartImgHeight = 50;
  15. //---------------------------------------------私有定制·配置区
  16. @interface MOLikeAnimation ()
  17. @end
  18. @implementation MOLikeAnimation
  19. #pragma mark -
  20. #pragma mark - 🎱 shareInstance 多线程单例
  21. + (instancetype)shareInstance {
  22. static MOLikeAnimation *selfInstance = nil;
  23. static dispatch_once_t predicate;
  24. dispatch_once(&predicate, ^{
  25. selfInstance = [[self alloc] init];
  26. });
  27. return selfInstance;
  28. }
  29. //用来计算连击数字
  30. static int clickTempNum = 7;
  31. //记录上一次显示的连击数字
  32. static int clickCacheNum = 1;
  33. /** 系统touch来触发的动画*/
  34. #pragma mark -
  35. #pragma mark - 🎱 createAnimationWithTounch: withEvent:
  36. - (void)mo_createAnimationWithTouch:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event withClickNum:(NSInteger)clickNum {
  37. NSSet *allTouches = [event allTouches];
  38. UITouch *touch = [allTouches anyObject];
  39. CGPoint point = [touch locationInView:[touch view]];
  40. UIImage *img = [MOLikeAnimation getClickImageWith:clickNum];
  41. UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, mo_heartImgWidth, mo_heartImgHeight)];
  42. imgV.image = img;
  43. imgV.contentMode = UIViewContentModeScaleAspectFit;
  44. CGPoint centerPoint = CGPointMake(point.x, (point.y - 25.0));
  45. imgV.center = centerPoint;
  46. UIView *clickView = [touch view];
  47. if([clickView isKindOfClass:[MORightToLeftBannerView class]] || [clickView isKindOfClass:[MOEnterBaseView class]]){
  48. return;
  49. }
  50. /** 左右随机显示*/
  51. // int leftOrRight = arc4random()%2;
  52. // leftOrRight = leftOrRight ? leftOrRight : -1;
  53. // imgV.transform = CGAffineTransformRotate(imgV.transform,M_PI / 9 * leftOrRight);
  54. [clickView addSubview:imgV];
  55. /** 出现的时候回弹一下*/
  56. __block UIImageView *blockImgV = imgV;
  57. __block UIImage *blockImg = img;
  58. [UIView animateWithDuration:0.1 animations:^{
  59. blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 1.2, 1.2);
  60. } completion:^(BOOL finished) {
  61. blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 0.8, 0.8);
  62. CGFloat amplitudeSS = M_PI_4 / 2.0; // 抖动的振幅,这里以π/4为例
  63. CGFloat amplitude = 20.0; // 晃动的振幅
  64. CGFloat duration = 0.1; // 动画持续时间
  65. [UIView animateWithDuration:duration
  66. delay:0
  67. options:(UIViewAnimationOptionAutoreverse)
  68. animations:^{
  69. blockImgV.transform = CGAffineTransformMakeRotation(amplitudeSS);
  70. }
  71. completion:^(BOOL finished) {
  72. // 回到原始状态
  73. [UIView animateWithDuration:0.1
  74. animations:^{
  75. blockImgV.transform = CGAffineTransformMakeRotation(0);
  76. }
  77. completion:^(BOOL finished) {
  78. /** 向上飘,放大,透明*/
  79. // [self performSelector:@selector(animationToTop:) withObject:@[blockImgV,blockImg] afterDelay:0.2];
  80. [self animationToTop:@[blockImgV,blockImg]];
  81. }];
  82. }];
  83. }];
  84. MOClickConfigManager *clickConfig = [MOClickConfigManager shareManager];
  85. NSInteger zuanShowNum = clickNum % 5;
  86. NSInteger comboShowNum = clickNum % (clickTempNum);
  87. //不是5的余数 或者 活动未开启 不再增加钻石
  88. //显示获取钻石
  89. if(clickNum == clickConfig.theClickNextNum && [MORefreshViewManage shareManager].likeDiamond){
  90. // MOLogV(@"the Click show Num %zd",clickNum);
  91. clickConfig.theAddNextClickNum = [clickConfig mo_nextClickNum];
  92. clickConfig.theAddNextDiamonNum = [clickConfig mo_nextZuanNum];
  93. clickConfig.theClickNextNum = clickConfig.theClickNextNum + clickConfig.theAddNextClickNum;
  94. clickConfig.theDiamondNextNum = clickConfig.theAddNextDiamonNum;
  95. CGFloat getZuanNum = clickConfig.theDiamondNextNum;
  96. CGFloat willGetDiamondNum = clickConfig.baseData.maxDiamond - clickConfig.baseData.diamond;
  97. if(getZuanNum > 0 && willGetDiamondNum > 0){
  98. UIFont *customFont = [UIFont fontWithName:kNormalGiftNumFontStre size:MOClickNumViewFont];
  99. CGFloat numWidth = 20.0;
  100. NSString *numStr = [NSString stringWithFormat:@"x%.f",getZuanNum];
  101. if(customFont){
  102. numWidth = [MOTools getWidthWithString:numStr font:customFont] + 20.0;
  103. }
  104. else{
  105. numWidth = [MOTools getWidthWithString:numStr font:[UIFont italicSystemFontOfSize:MOClickNumViewFont]] + 20.0;
  106. }
  107. if(numWidth < 30.0){
  108. numWidth = 30.0;
  109. }
  110. MOClickNumView *zuanView = [[MOClickNumView alloc] initWithFrame:CGRectMake(0.0, 0.0, numWidth, 30.0)];
  111. CGPoint centerPoint = CGPointMake(point.x, (point.y - 70.0));
  112. zuanView.center = centerPoint;
  113. NSInteger zuanNum = (NSInteger)getZuanNum;
  114. [zuanView showViewWith:clickView ShowNum:zuanNum isGetZuan:YES];
  115. //显示了钻石, 不再显示连击数
  116. return;
  117. }
  118. }
  119. //显示连击数
  120. if(comboShowNum == 0){
  121. NSInteger spacingNum = clickNum - clickCacheNum;
  122. if(spacingNum > 0){
  123. if(spacingNum < 5){
  124. return;
  125. }
  126. }
  127. UIFont *customFont = [UIFont fontWithName:kNormalGiftNumFontStre size:MOClickNumViewFont];
  128. CGFloat numWidth = 20.0;
  129. NSString *numStr = [NSString stringWithFormat:@"x%zd",clickNum];
  130. if(customFont){
  131. numWidth = [MOTools getWidthWithString:numStr font:customFont];
  132. }
  133. else{
  134. numWidth = [MOTools getWidthWithString:numStr font:[UIFont italicSystemFontOfSize:MOClickNumViewFont]];
  135. }
  136. if(numWidth < 30.0){
  137. numWidth = 30.0;
  138. }
  139. MOClickNumView *zuanView = [[MOClickNumView alloc] initWithFrame:CGRectMake(0.0, 0.0, numWidth, 30.0)];
  140. CGPoint centerPoint = CGPointMake(point.x, (point.y - 70.0));
  141. zuanView.center = centerPoint;
  142. [zuanView showViewWith:clickView ShowNum:clickNum isGetZuan:NO];
  143. //随机一个公约数
  144. NSInteger j = arc4random_uniform(3);
  145. clickTempNum = clickTempNum + 6 + j;
  146. //缓存上一次的连击数
  147. clickCacheNum = clickNum;
  148. }
  149. if(clickTempNum > 27){
  150. clickTempNum = 7;
  151. }
  152. }
  153. /** 点击来触发的动画*/
  154. #pragma mark -
  155. #pragma mark - 🎱 createAnimationWithTap:
  156. - (void)mo_createAnimationWithTap:(UITapGestureRecognizer *)tap {
  157. CGPoint point = [tap locationInView:[tap view]];
  158. UIImage *img = [MOLikeAnimation getClickImageWith:1];
  159. UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, mo_heartImgWidth, mo_heartImgHeight)];
  160. imgV.image = img;
  161. imgV.contentMode = UIViewContentModeScaleAspectFill;
  162. imgV.center = point;
  163. [[tap view] addSubview:imgV];
  164. /** 左右随机显示*/
  165. int leftOrRight = arc4random()%2;
  166. leftOrRight = leftOrRight ? leftOrRight : -1;
  167. imgV.transform = CGAffineTransformRotate(imgV.transform,M_PI / 9 * leftOrRight);
  168. /** 出现的时候回弹一下*/
  169. __block UIImageView *blockImgV = imgV;
  170. __block UIImage *blockImg = img;
  171. [UIView animateWithDuration:0.1 animations:^{
  172. blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 1.2, 1.2);
  173. } completion:^(BOOL finished) {
  174. blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 0.8, 0.8);
  175. /** 向上飘,放大,透明*/
  176. [self performSelector:@selector(animationToTop:) withObject:@[blockImgV,blockImg] afterDelay:0.3];
  177. }];
  178. }
  179. #pragma mark -
  180. #pragma mark - 🎱 animationToTop
  181. - (void)animationToTop:(NSArray *)imgObjects {
  182. if (imgObjects && imgObjects.count > 0) {
  183. __block UIImageView *imageV = (UIImageView *)imgObjects[0];
  184. __block UIImage *img = (UIImage *)imgObjects[1];
  185. [UIView animateWithDuration:0.3 animations:^{
  186. // imageV.frame = CGRectMake(imageV.frame.origin.x, imageV.frame.origin.y - 100, imageV.frame.size.width, imageV.frame.size.height);
  187. // imageV.transform = CGAffineTransformScale(imageV.transform, 1.2, 1.2);
  188. imageV.alpha = 0.0;
  189. } completion:^(BOOL finished) {
  190. [imageV removeFromSuperview];
  191. imageV = nil;
  192. img = nil;
  193. }];
  194. }
  195. }
  196. //获取点击的图片
  197. + (UIImage *)getClickImageWith:(NSInteger)clickNum{
  198. NSInteger num = clickNum % 14 + 1;
  199. NSString *imageName = [NSString stringWithFormat:@"icon_click_%zd",num];
  200. UIImage *needImg = [UIImage imageNamed:imageName];
  201. if(needImg == nil){
  202. UIImage *needImg = [UIImage imageNamed:@"icon_click_1"];
  203. }
  204. return needImg;
  205. }
  206. //获取点击气泡的图片
  207. + (UIImage *)getClickBubbleImageWith:(NSInteger)clickNum{
  208. NSInteger num = clickNum % 14 + 1;
  209. NSString *imageName = [NSString stringWithFormat:@"icon_click_b_%zd",num];
  210. UIImage *needImg = [UIImage imageNamed:imageName];
  211. if(needImg == nil){
  212. UIImage *needImg = [UIImage imageNamed:@"icon_click_b_1"];
  213. }
  214. return needImg;
  215. }
  216. @end