我有一个UIImage
的波形是根据音频文件的样本创建的。波形为蓝色,背景为白色。我希望蓝色波形在播放音频时变为红色以指示进度。如果我有两个相同波形的UIImage:一个是蓝色的,一个是红色的 - 是否有某种动画图像擦拭我可以做到这一点?
当波形为UIView
并且我只是在蓝色UIView波形上绘制红色UIView波形时,我能够实现这一点,但是如果我有多个波形(我这样做 - 在tableview),这使我的CPU使用率超过95%并导致很多延迟 - 即使没有播放音频。我相信如果我走UIImage路线,因为我只有静态图像,所以事情会更顺畅。
任何提示?
答案 0 :(得分:1)
据我所知,唯一的方法是将两个UIImageViews放在另一个上面,并在顶部设置一个蒙版动画,使其以从左到右的方式消失,从而显示图像下。在测试应用程序中,我有图像视图,红色图像位于蓝色图像的顶部。
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *redImageView;
@property (weak, nonatomic) IBOutlet UIImageView *blueImageView;
@property (strong,nonatomic) UIBezierPath *maskPath;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.maskPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 0, self.redImageView.bounds.size.height)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.redImageView.bounds;
maskLayer.path = self.maskPath.CGPath;
self.redImageView.layer.mask = maskLayer;
[self performSelector:@selector(enlargeMask:) withObject:maskLayer afterDelay:2];
}
-(void)enlargeMask:(CAShapeLayer *) shapeLayer {
UIBezierPath *newPath = [UIBezierPath bezierPathWithRect:self.redImageView.bounds];
CABasicAnimation* pathAnim = [CABasicAnimation animationWithKeyPath: @"path"];
pathAnim.fromValue = (id)self.maskPath.CGPath;
pathAnim.toValue = (id)newPath.CGPath;
pathAnim.duration = 1;
shapeLayer.path = newPath.CGPath;
[shapeLayer addAnimation:pathAnim forKey:@"path"];
}