iOS 显示递归加载动画直到初始化代码块完成,然后显示最后一个动画
iOS show recursive loading animation until completion of initialisation code block, then show the last animation
我想在初始化时显示加载动画。所以我想旋转我的 (UIImageView*)_LogoImage
直到我的初始化完成。然后,在初始化完成后,我想缩放我的 _LogoImage。所以,所有这一切都从 viewDidAppear
开始,我在这里调用 beginLoading: 方法。
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self beginLoading];
}
在这里,我开始我的旋转动画。假设,我在接下来的两行代码中进行了一些初始化,我将它们更改为使线程休眠以实现与我的初始化代码类似的行为。然后我调用 stopSpin: 方法来制作下一个半圆并做我最后的缩放动画。
-(void)beginLoading{
[self startSpin];
[self sleepAction:3.0f];
[self sleepAction:1.0f];
[self stopSpin];
}
-(void)sleepAction:(float)sleepTime{
NSLog(@"SleepTime:[%f]",sleepTime);
[NSThread sleepForTimeInterval:sleepTime];
}
这是我的旋转代码,我递归调用它直到我的 BOOL refreshAnimating 等于 YES。如果不是 - 运行最后一个缩放动画
-(void)startSpin{
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform = CGAffineTransformMakeRotation(0);
}
completion:^(BOOL finished){
if (refreshAnimating) {
[self startSpin];
}else{
[self refreshFinished];
}
}];
}];
}
-(void)stopSpin{
refreshAnimating = NO;
}
-(void)refreshFinished{
[UIView animateWithDuration:0.4 animations:^{
[_LogoImage setTransform:CGAffineTransformMakeScale(2, 2)];
}];
}
问题是我的动画不是 运行ning,直到最后一行初始化代码完成。完成后 - 我只能看到最后一个动画。我试图在后台和主线程中执行一些代码,但我没有 运行 我想要的方式。
旋转动画应该在视图出现时开始,并一直持续到我的初始化代码完成 - 然后我想看到我的最后一个缩放动画,这将表明我的初始化已完成。
请帮忙
主线程上的所有动画 运行,如果您使用睡眠,它会阻塞您的动画(主线程)。相反,您可以使用如下库:MBProgressHUD 请随时提出更多问题。
编辑
-(void)startSpin{
_LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform =CGAffineTransformMakeRotation(0);
}
completion:nil];
}
你能试试这个吗?我认为这就是我们正在努力做的。
正如@Ersin Sezgin 所说,主线程上的所有动画 运行。
所以现在,我正在后台使用完成块处理程序进行初始化,这会强制 stopSpin: 初始化完成后。
这是一些代码块。为了更好的可读性,有块的 typedef。
typedef void(^OperationSuccessCompletionHandler)(BOOL success);
在 .m 文件中
-(void)sleepAction:(OperationSuccessCompletionHandler)success{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// We are doing initialisation here
BOOL isOperationSuccess = YES // Assume initialisation was successful
success(isOperationSuccess);
});
}
所以现在我们可以用另一种方式做到这一点
-(void)beginLoading{
[self startSpin];
[self sleepAction:^(BOOL success){
[self sleepAction:^(BOOL success){
[self stopSpin];
}];
}];
}
我想在初始化时显示加载动画。所以我想旋转我的 (UIImageView*)_LogoImage
直到我的初始化完成。然后,在初始化完成后,我想缩放我的 _LogoImage。所以,所有这一切都从 viewDidAppear
开始,我在这里调用 beginLoading: 方法。
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self beginLoading];
}
在这里,我开始我的旋转动画。假设,我在接下来的两行代码中进行了一些初始化,我将它们更改为使线程休眠以实现与我的初始化代码类似的行为。然后我调用 stopSpin: 方法来制作下一个半圆并做我最后的缩放动画。
-(void)beginLoading{
[self startSpin];
[self sleepAction:3.0f];
[self sleepAction:1.0f];
[self stopSpin];
}
-(void)sleepAction:(float)sleepTime{
NSLog(@"SleepTime:[%f]",sleepTime);
[NSThread sleepForTimeInterval:sleepTime];
}
这是我的旋转代码,我递归调用它直到我的 BOOL refreshAnimating 等于 YES。如果不是 - 运行最后一个缩放动画
-(void)startSpin{
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform = CGAffineTransformMakeRotation(0);
}
completion:^(BOOL finished){
if (refreshAnimating) {
[self startSpin];
}else{
[self refreshFinished];
}
}];
}];
}
-(void)stopSpin{
refreshAnimating = NO;
}
-(void)refreshFinished{
[UIView animateWithDuration:0.4 animations:^{
[_LogoImage setTransform:CGAffineTransformMakeScale(2, 2)];
}];
}
问题是我的动画不是 运行ning,直到最后一行初始化代码完成。完成后 - 我只能看到最后一个动画。我试图在后台和主线程中执行一些代码,但我没有 运行 我想要的方式。 旋转动画应该在视图出现时开始,并一直持续到我的初始化代码完成 - 然后我想看到我的最后一个缩放动画,这将表明我的初始化已完成。 请帮忙
主线程上的所有动画 运行,如果您使用睡眠,它会阻塞您的动画(主线程)。相反,您可以使用如下库:MBProgressHUD 请随时提出更多问题。
编辑
-(void)startSpin{
_LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform =CGAffineTransformMakeRotation(0);
}
completion:nil];
}
你能试试这个吗?我认为这就是我们正在努力做的。
正如@Ersin Sezgin 所说,主线程上的所有动画 运行。 所以现在,我正在后台使用完成块处理程序进行初始化,这会强制 stopSpin: 初始化完成后。 这是一些代码块。为了更好的可读性,有块的 typedef。
typedef void(^OperationSuccessCompletionHandler)(BOOL success);
在 .m 文件中
-(void)sleepAction:(OperationSuccessCompletionHandler)success{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// We are doing initialisation here
BOOL isOperationSuccess = YES // Assume initialisation was successful
success(isOperationSuccess);
});
}
所以现在我们可以用另一种方式做到这一点
-(void)beginLoading{
[self startSpin];
[self sleepAction:^(BOOL success){
[self sleepAction:^(BOOL success){
[self stopSpin];
}];
}];
}