| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- //
- // MOLikeAnimation.m
- //
- #import "MOLikeAnimation.h"
- #import "MOShowRoomLiveView.h"
- #import "MOClickNumView.h"
- #import "MOClickConfigManager.h"
- //---------------------------------------------私有定制·配置区
- /** ❤️形图片的名字*/
- NSString *const mo_heartImgName = @"icon_click_";
- /** ❤️形图片的宽度*/
- const CGFloat mo_heartImgWidth = 50;
- /** ❤️形图片的高度*/
- const CGFloat mo_heartImgHeight = 50;
- //---------------------------------------------私有定制·配置区
- @interface MOLikeAnimation ()
- @end
- @implementation MOLikeAnimation
- #pragma mark -
- #pragma mark - 🎱 shareInstance 多线程单例
- + (instancetype)shareInstance {
- static MOLikeAnimation *selfInstance = nil;
- static dispatch_once_t predicate;
- dispatch_once(&predicate, ^{
- selfInstance = [[self alloc] init];
- });
-
- return selfInstance;
- }
- //用来计算连击数字
- static int clickTempNum = 7;
- //记录上一次显示的连击数字
- static int clickCacheNum = 1;
- /** 系统touch来触发的动画*/
- #pragma mark -
- #pragma mark - 🎱 createAnimationWithTounch: withEvent:
- - (void)mo_createAnimationWithTouch:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event withClickNum:(NSInteger)clickNum {
- NSSet *allTouches = [event allTouches];
- UITouch *touch = [allTouches anyObject];
- CGPoint point = [touch locationInView:[touch view]];
- UIImage *img = [MOLikeAnimation getClickImageWith:clickNum];
- UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, mo_heartImgWidth, mo_heartImgHeight)];
- imgV.image = img;
- imgV.contentMode = UIViewContentModeScaleAspectFit;
- CGPoint centerPoint = CGPointMake(point.x, (point.y - 25.0));
- imgV.center = centerPoint;
-
- UIView *clickView = [touch view];
- if([clickView isKindOfClass:[MORightToLeftBannerView class]] || [clickView isKindOfClass:[MOEnterBaseView class]]){
- return;
- }
-
- /** 左右随机显示*/
- // int leftOrRight = arc4random()%2;
- // leftOrRight = leftOrRight ? leftOrRight : -1;
- // imgV.transform = CGAffineTransformRotate(imgV.transform,M_PI / 9 * leftOrRight);
- [clickView addSubview:imgV];
-
- /** 出现的时候回弹一下*/
- __block UIImageView *blockImgV = imgV;
- __block UIImage *blockImg = img;
- [UIView animateWithDuration:0.1 animations:^{
- blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 1.2, 1.2);
- } completion:^(BOOL finished) {
- blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 0.8, 0.8);
-
- CGFloat amplitudeSS = M_PI_4 / 2.0; // 抖动的振幅,这里以π/4为例
- CGFloat amplitude = 20.0; // 晃动的振幅
- CGFloat duration = 0.1; // 动画持续时间
-
- [UIView animateWithDuration:duration
- delay:0
- options:(UIViewAnimationOptionAutoreverse)
- animations:^{
- blockImgV.transform = CGAffineTransformMakeRotation(amplitudeSS);
- }
- completion:^(BOOL finished) {
-
- // 回到原始状态
- [UIView animateWithDuration:0.1
- animations:^{
- blockImgV.transform = CGAffineTransformMakeRotation(0);
- }
- completion:^(BOOL finished) {
- /** 向上飘,放大,透明*/
- // [self performSelector:@selector(animationToTop:) withObject:@[blockImgV,blockImg] afterDelay:0.2];
-
- [self animationToTop:@[blockImgV,blockImg]];
- }];
- }];
- }];
-
- MOClickConfigManager *clickConfig = [MOClickConfigManager shareManager];
-
- NSInteger zuanShowNum = clickNum % 5;
-
- NSInteger comboShowNum = clickNum % (clickTempNum);
-
- //不是5的余数 或者 活动未开启 不再增加钻石
- //显示获取钻石
- if(clickNum == clickConfig.theClickNextNum && [MORefreshViewManage shareManager].likeDiamond){
-
- // MOLogV(@"the Click show Num %zd",clickNum);
-
- clickConfig.theAddNextClickNum = [clickConfig mo_nextClickNum];
- clickConfig.theAddNextDiamonNum = [clickConfig mo_nextZuanNum];
- clickConfig.theClickNextNum = clickConfig.theClickNextNum + clickConfig.theAddNextClickNum;
- clickConfig.theDiamondNextNum = clickConfig.theAddNextDiamonNum;
-
- CGFloat getZuanNum = clickConfig.theDiamondNextNum;
- CGFloat willGetDiamondNum = clickConfig.baseData.maxDiamond - clickConfig.baseData.diamond;
- if(getZuanNum > 0 && willGetDiamondNum > 0){
- UIFont *customFont = [UIFont fontWithName:kNormalGiftNumFontStre size:MOClickNumViewFont];
- CGFloat numWidth = 20.0;
- NSString *numStr = [NSString stringWithFormat:@"x%.f",getZuanNum];
- if(customFont){
- numWidth = [MOTools getWidthWithString:numStr font:customFont] + 20.0;
- }
- else{
- numWidth = [MOTools getWidthWithString:numStr font:[UIFont italicSystemFontOfSize:MOClickNumViewFont]] + 20.0;
- }
-
- if(numWidth < 30.0){
- numWidth = 30.0;
- }
-
- MOClickNumView *zuanView = [[MOClickNumView alloc] initWithFrame:CGRectMake(0.0, 0.0, numWidth, 30.0)];
- CGPoint centerPoint = CGPointMake(point.x, (point.y - 70.0));
- zuanView.center = centerPoint;
- NSInteger zuanNum = (NSInteger)getZuanNum;
- [zuanView showViewWith:clickView ShowNum:zuanNum isGetZuan:YES];
-
- //显示了钻石, 不再显示连击数
- return;
- }
- }
-
- //显示连击数
- if(comboShowNum == 0){
-
- NSInteger spacingNum = clickNum - clickCacheNum;
-
- if(spacingNum > 0){
- if(spacingNum < 5){
- return;
- }
- }
-
- UIFont *customFont = [UIFont fontWithName:kNormalGiftNumFontStre size:MOClickNumViewFont];
- CGFloat numWidth = 20.0;
- NSString *numStr = [NSString stringWithFormat:@"x%zd",clickNum];
- if(customFont){
- numWidth = [MOTools getWidthWithString:numStr font:customFont];
- }
- else{
- numWidth = [MOTools getWidthWithString:numStr font:[UIFont italicSystemFontOfSize:MOClickNumViewFont]];
- }
-
- if(numWidth < 30.0){
- numWidth = 30.0;
- }
-
- MOClickNumView *zuanView = [[MOClickNumView alloc] initWithFrame:CGRectMake(0.0, 0.0, numWidth, 30.0)];
- CGPoint centerPoint = CGPointMake(point.x, (point.y - 70.0));
- zuanView.center = centerPoint;
- [zuanView showViewWith:clickView ShowNum:clickNum isGetZuan:NO];
-
- //随机一个公约数
- NSInteger j = arc4random_uniform(3);
- clickTempNum = clickTempNum + 6 + j;
- //缓存上一次的连击数
- clickCacheNum = clickNum;
- }
-
- if(clickTempNum > 27){
- clickTempNum = 7;
- }
- }
- /** 点击来触发的动画*/
- #pragma mark -
- #pragma mark - 🎱 createAnimationWithTap:
- - (void)mo_createAnimationWithTap:(UITapGestureRecognizer *)tap {
- CGPoint point = [tap locationInView:[tap view]];
- UIImage *img = [MOLikeAnimation getClickImageWith:1];
- UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, mo_heartImgWidth, mo_heartImgHeight)];
- imgV.image = img;
- imgV.contentMode = UIViewContentModeScaleAspectFill;
- imgV.center = point;
- [[tap view] addSubview:imgV];
-
- /** 左右随机显示*/
- int leftOrRight = arc4random()%2;
- leftOrRight = leftOrRight ? leftOrRight : -1;
- imgV.transform = CGAffineTransformRotate(imgV.transform,M_PI / 9 * leftOrRight);
-
- /** 出现的时候回弹一下*/
- __block UIImageView *blockImgV = imgV;
- __block UIImage *blockImg = img;
- [UIView animateWithDuration:0.1 animations:^{
- blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 1.2, 1.2);
- } completion:^(BOOL finished) {
- blockImgV.transform = CGAffineTransformScale(blockImgV.transform, 0.8, 0.8);
- /** 向上飘,放大,透明*/
- [self performSelector:@selector(animationToTop:) withObject:@[blockImgV,blockImg] afterDelay:0.3];
- }];
-
- }
- #pragma mark -
- #pragma mark - 🎱 animationToTop
- - (void)animationToTop:(NSArray *)imgObjects {
- if (imgObjects && imgObjects.count > 0) {
- __block UIImageView *imageV = (UIImageView *)imgObjects[0];
- __block UIImage *img = (UIImage *)imgObjects[1];
- [UIView animateWithDuration:0.3 animations:^{
- // imageV.frame = CGRectMake(imageV.frame.origin.x, imageV.frame.origin.y - 100, imageV.frame.size.width, imageV.frame.size.height);
- // imageV.transform = CGAffineTransformScale(imageV.transform, 1.2, 1.2);
- imageV.alpha = 0.0;
- } completion:^(BOOL finished) {
- [imageV removeFromSuperview];
- imageV = nil;
- img = nil;
- }];
- }
- }
- //获取点击的图片
- + (UIImage *)getClickImageWith:(NSInteger)clickNum{
- NSInteger num = clickNum % 14 + 1;
- NSString *imageName = [NSString stringWithFormat:@"icon_click_%zd",num];
- UIImage *needImg = [UIImage imageNamed:imageName];
- if(needImg == nil){
- UIImage *needImg = [UIImage imageNamed:@"icon_click_1"];
- }
- return needImg;
- }
- //获取点击气泡的图片
- + (UIImage *)getClickBubbleImageWith:(NSInteger)clickNum{
- NSInteger num = clickNum % 14 + 1;
- NSString *imageName = [NSString stringWithFormat:@"icon_click_b_%zd",num];
- UIImage *needImg = [UIImage imageNamed:imageName];
- if(needImg == nil){
- UIImage *needImg = [UIImage imageNamed:@"icon_click_b_1"];
- }
- return needImg;
- }
- @end
|