【发布时间】:2014-12-22 11:25:18
【问题描述】:
我有一个View 显示和隐藏给用户一些提示。
显示和隐藏方法如下所示:
-(void)show{
[UIView animateWithDuration:3.0f
animations:^{
//do something to show self to give hint;
self.frame = CGRectMake(0,0,0,0);
} completion:nil];
}
-(void)hide{
[UIView animateWithDuration:3.0f
animations:^{
//do something to hide self to give hint;
self.frame = CGRectMake(centerX,centerY,100,100);
} completion:nil];
}
显示新视图时,我必须调用hide method,然后调用show method。但是持续时间延迟 3.0f 会导致一些错误。我正在使用这样的方法:
dispatch_async(dispatch_get_main_queue(), ^{
[view hide];
});
dispatch_async(dispatch_get_main_queue(), ^{
[view show];
});
我在hide method 之后打电话给show method。动画不能按照它们提交到队列的顺序执行。我想要的是在hide method 完成之后执行的show method。如何控制这两种方法的顺序。
我认为我无法使用完成处理程序,因为我无法确定调用这两个方法的位置,或者当我调用另一个 show method 或 hide method 时是否显示视图。
如果我不清楚,有什么建议吗?我将重新编辑我的问题。
PS:
这不仅仅是一个闪光。当调用下一个 show 方法时,我无法保证显示或隐藏最后一个视图以及显示最后一个视图的时间,也就是说,如果正在显示视图并且已经调用了 hide 方法并且已经完成,然后调用show方法,结果是对的。如果正在显示视图,则需要显示另一个提示视图,我会先调用hide,然后调用show,因为main_queue 是串行的但动画块是同步执行的,所以结果是错误的。我正在寻找 GCD 中是否有某种锁可以帮助我在最后一个排队块完成后执行一个块,而不是在 show 和 hide 方法内更改。因为有许多其他对 show 和 hide 方法的调用具有许多不同类型的参数,我需要修复我的代码中的许多地方。
【问题讨论】:
-
An answer to this question 建议使用关键帧动画,这可能对您有用。
-
将标志传递给 show 或 hide 方法,指示您是否要调用下一个。然后在完成方法中对其进行操作。
-
@jrturton 的解决方案将起作用。您还可以创建一个
NSOperationQueue并将您的显示/隐藏命令添加到此队列。如果操作不再运行,您可以调用cancel。 -
@AaronBrager 我试过 NSOperationQueue。似乎即使我在将新操作添加到队列之前取消了所有操作,添加到队列的动画也无法取消。
标签: ios animation grand-central-dispatch