美文网首页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