使用Android上的Bukkit插件,我可以使用简单的runTaskLater()
方法来执行一个方法,让它执行一个操作,然后在设定的时间后运行另一个操作,但是在iOS上我只知道performSelector:
方法。
我正在尝试做的一个很好的例子是一些文本的淡化动画。假设我希望它首先淡入,然后在达到峰值不透明度后淡出一秒钟,此刻我不得不使用两种不同的方法来淡入淡出,这似乎效率很低,但是我不能看一下如何做到这一点的例子或解释。这当然可以归结为我对搜索条件的不良选择。
如何在一段时间内延迟一段代码?
答案 0 :(得分:4)
您尝试过其中任何一种方法吗?
const float delayInSeconds = 3.0;
NSString *myObject = @"Hello";
// method 1
[self performSelector:@selector(doSomethingWithObject:) withObject:myObject afterDelay:delayInSeconds];
// method 2
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self doSomethingWithObject:myObject];
});
要回答有关淡入淡出标签的问题,请尝试以下方法:
label.alpha = 0.0f;
[UIView animateWithDuration:2.f delay:0.f options:UIViewAnimationOptionCurveEaseIn animations:^{
[label setAlpha:1.f];
} completion:^(BOOL finished) {
[UIView animateWithDuration:2.f delay:1.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
[label setAlpha:0.f];
} completion:nil];
}];
答案 1 :(得分:1)
doctordoder的答案解释了如何为以后安排工作单元,无论是特定的方法调用还是完全关闭。
然而,阅读以下几行:
我正在尝试做的一个很好的例子是褪色动画 一些文字。说我希望它首先淡入,然后淡出一个 在它达到峰值不透明度之后的第二个,此刻我正在 使用两种不同的方法来淡入淡出,这似乎是相反的 效率低下,但是我无法遇到一个例子或者 解释如何做到这一点。这当然可以归结为 我选择的搜索条件很差。
对于该特定示例,您应该让CoreAnimation为您完成工作,而不是编写自己的代码。标准观察适用:如果您可以在您正在考虑的水平上与系统进行通信,请执行此操作,因为它可以精确地优化您想要执行的操作。在这种情况下,工作将忽略其他组成更改,安全地在完全独立的线程上发生 - 在这里特别有用,否则您将不得不在主线程上进行工作 - 并且具有一堆保证的时序特性。
在Apple的文档中发现它很痛苦但是由于CABasicAnimation
实现了CAMediaTiming
,这意味着它提供了beginTime
。因此,通过手动构建动画并通过CALayer
将其直接附加到-addAnimation:forKey:
,您可以同时附加淡入和淡出,指定淡出不会开始加上第一个动画的时间,你将得到整个事情而不需要进一步的设计。
或者,使用UIView
的{{1}}指定适当的延迟,通过UIKit便捷方法实现相同的目标。