我正在尝试使用动画 block 来扩展 UIView,这非常有效。但是,我希望 UILabel 从 0 开始,每 0.01 秒加 1,直到达到 100。
我在动画之后创建了一个线程来完成这个任务,它可以工作,但它导致我设置的动画什么也不做。
我尝试了很多不同的事情,但没有运气。实现这一目标的最佳方法是什么?
我最简单的尝试与所有其他尝试的结果相同:
[UIView animateWithDuration:1 animations:^{
_lView.frame = CGRectMake(_lView.frame.origin.x,_lView.frame.origin.y+_lView.frame.size.height,_lView.frame.size.width,-500);
}];
[[[NSThread alloc]initWithTarget:self selectorselector(startcounting) object:nil]start];
-(void)startcounting{
for(int x=0; x<100; x++){
[NSThread sleepForTimeInterval:0.01];
++_mcount;
dispatch_async(dispatch_get_main_queue(), ^{
_cLabel.text = [NSString stringWithFormat"%i",_mcount];
});
}
}
有两个问题:
layoutIfNeeded
在动画 block 中。见 Animating an image view to slide upwards @interface ViewController ()
@property (nonatomic, strong) CADisplayLink *displayLink;
@property (nonatomic) CFTimeInterval startTime;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
@implementation ViewController
- (void)startDisplayLink {
self.displayLink = [CADisplayLink displayLinkWithTarget:self selectorselector(handleDisplayLink];
self.startTime = CACurrentMediaTime();
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)stopDisplayLink {
[self.displayLink invalidate];
self.displayLink = nil;
}
- (void)handleDisplayLinkCADisplayLink *)displayLink {
CFTimeInterval elapsed = CACurrentMediaTime() - self.startTime;
if (elapsed < 1) {
self.label.text = [NSString stringWithFormat"%.0f", elapsed * 100.0];
} else {
self.label.text = @"100";
[self stopDisplayLink];
}
}
startDisplayLink
(来自主线程)并且当 View 动画时,您的标签将在一秒钟内从 0 更新到 100:[self startDisplayLink];
self.topConstraint.constant += self.lView.frame.size.height;
[UIView animateWithDuration:1.0 animations:^{
[self.view layoutIfNeeded];
}];
关于ios - 带有同步计数线程的 UIView 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32001755/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |