美文网首页iOS常用
iOS 歌词变色的核心代码

iOS 歌词变色的核心代码

作者: LV大树 | 来源:发表于2021-03-10 15:03 被阅读0次

    下面这份代码是抄自”高仿酷狗音乐歌词“
    // Created by liuyang on 16/3/14.
    // Copyright © 2016年 ly. All rights reserved.

    
    - (void)startLyricsAnimationWithTimeArray:(NSArray *)timeArray andLocationArray:(NSArray *)locationArray {
        //每行歌词的时间总长
        CGFloat totalDuration = [timeArray.lastObject floatValue]*1.0/1000;
        
        CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"bounds.size.width"];
        NSMutableArray *keyTimeArray = [NSMutableArray array];
        NSMutableArray *widthArray = [NSMutableArray array];
        for (int i = 0 ; i < timeArray.count; i++) {
            CGFloat tempTime = [timeArray[i] floatValue] *1.0/1000/totalDuration;
            [keyTimeArray addObject:@(tempTime)];
            CGFloat tempWidth = [locationArray[i] floatValue] * CGRectGetWidth(self.maskLable.frame);
            [widthArray addObject:@(tempWidth)];
        }
        animation.values = widthArray;
        animation.keyTimes = keyTimeArray;
        animation.duration = totalDuration;
        animation.calculationMode = kCAAnimationLinear;
        animation.fillMode = kCAFillModeForwards;
        animation.removedOnCompletion = NO;
        [self.maskLayer addAnimation:animation forKey:@"MaskAnimation"];
    }
    
    
    - (void)stopAnimation {
        //[self pauseLayer:self.maskLayer];
        
        [self.maskLayer removeAllAnimations];
        
        self.maskLayer=nil;
    }
    
    //暂停
    -(void)pauseLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
        
        // 让CALayer的时间停止走动
        layer.speed = 0.0;
        // 让CALayer的时间停留在pausedTime这个时刻
        layer.timeOffset = pausedTime;
    }
    
    - (void)reAnimation
    {
        [self resumeLayer:self.maskLayer];
    }
    
    //恢复
    -(void)resumeLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = layer.timeOffset;
        // 1. 让CALayer的时间继续行走
        layer.speed = 1.0;
        // 2. 取消上次记录的停留时刻
        layer.timeOffset = 0.0;
        // 3. 取消上次设置的时间
        layer.beginTime = 0.0;
        // 4. 计算暂停的时间(这里也可以用CACurrentMediaTime()-pausedTime)
        CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
        // 5. 设置相对于父坐标系的开始时间(往后退timeSincePause)
        layer.beginTime = timeSincePause;
    }
    

    解释:
    一.底部一个label,上面一个label,两个label 字体颜色不一样,但必须重合。
    用时间去控制上面的label的显示,即可。
    代码中,用了一个masklayer,通过改变width,控制显示的宽度。

    相关文章

      网友评论

        本文标题:iOS 歌词变色的核心代码

        本文链接:https://www.haomeiwen.com/subject/hguwqltx.html