我想在进行初始化时显示加载动画。所以我想旋转我的(UIImageView*)_LogoImage
,直到我的初始化完成。然后,在完成初始化之后,我想缩放我的_LogoImage。所以,所有这些都从viewDidAppear
开始,我在这里调用beginLoading:method。
-(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)];
}];
}
问题是我的动画没有运行,直到最后一个初始化代码行完成。完成后 - 我只能看到最后一个动画。我试图在后台和主线程中执行一些代码,但我没有按照我想要的方式运行。 旋转动画应该在视图出现时开始,并继续直到我的初始化代码完成 - 然后我想看到我的最后一个缩放动画,这将表明我的初始化已完成。 请帮忙。
答案 0 :(得分:0)
所有动画都在主线程上运行,如果你使用sleep,它会阻止你的动画(主线程)。相反,您可以使用像MBProgressHUD这样的库,请随时提出进一步的问题。
修改
-(void)startSpin{
_LogoImage.transform = CGAffineTransformMakeRotation(M_PI);
[UIView animateWithDuration:0.4
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
_LogoImage.transform =CGAffineTransformMakeRotation(0);
}
completion:nil];
}
你能试试吗?我认为这就是我们想要做的事情。
答案 1 :(得分:0)
正如@Ersin Sezgin所说,所有动画都在主线程上运行。 所以现在,我正在使用完成块处理程序在后台进行初始化,这会强制stopSpin:初始化完成后。 这是一些代码块。为了更好的可读性,有block的typedef。
typedef void(^OperationSuccessCompletionHandler)(BOOL success);
<。>文件中的
-(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];
}];
}];
}