今天遇到个场景,是在UIView做动画效果期间显示进度和百分比,以后发现UIView包括block方法在内的都没有动画移动进程之间的回调,查阅后可以使用NSTimer来获得
_progressTimer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(testAction) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_progressTimer forMode:NSRunLoopCommonModes];
_progressTimer是个全局的timer,添加到NSRunLoop里后通过它的消息处理机制来监听目标属性的改变,testAction是履行方法- (void)testAction
{
CALayer *layer = _progressView.layer.presentationLayer;
_yesLabel.text = [NSString stringWithFormat:@"我喜欢 %.2f%@", (100*layer.bounds.size.width)/ScreenSize().width, @"%"];
_noLabel.text = [NSString stringWithFormat:@"1般 %.2f%@", 100 - (100*layer.bounds.size.width)/ScreenSize().width, @"%"];
}
在testAction方法里,通过presentationLayer属性来获得到对象的CALayer,以后处理想要的结果,记得在实行终了后干掉timer,下面是动画履行的方法
[UIView animateWithDuration:1
animations:^{
_progressView.frame = CGRectMake(0, 0, self.frame.size.width/100.0*self.progress, self.frame.size.height);
}
completion:^(BOOL finished){
if (_progressTimer) {
[_progressTimer invalidate];
_progressTimer = nil;
}
}];