1

在我的ViewController中,我尝试同时隐藏两个图像(当前显示),但延迟了 3 秒。我用户

[self performSelector:@selector(hideThem:) withObject:val afterDelay:3.0];

其中“ hideThem”是使用以下内容隐藏图像的例程。“val”只是一个NSNumber,对这个问题并不重要。

  [image1 setHidden:YES];  
  [image2 setHidden:YES];

如果我直接调用“ hideThem”(不使用performSelector),两个图像会同时消失,这是预期的效果。

如果,我使用performSelector,如图所示,一个图像将隐藏,然后在 0.5 秒(左右)后,另一个图像将隐藏。我没有自己的运行循环。图像是UIImageView对象,是“self”下的视图层次结构的一部分。

我认为这是IOS对事件时间处理方式的影响,但我不明白为什么setHidden当两者都应该设置为隐藏“之后”performSelector调用“ hideThem”触发时,会发生 0.5 秒延迟的影响。

IOS会导致这种行为吗?

解决此问题的推荐方法是什么(以便在 3 秒后,两个图像在视觉上同时隐藏。

4

4 回答 4

0

:1)我可以在方法调用中看到一个冒号@selector(hideThem:),仔细检查你的 hideThem 方法是否接受输入参数。

2)确保你[self performSelector:@selector(hideThem:) withObject:val afterDelay:3.0]; 在主线程上调用它

尝试,

performSelectorOnMainThread
于 2013-04-27T13:55:27.083 回答
0

我找到了罪魁祸首。感谢所有帮助我隔离问题的建议。而且,David H... 非常有趣的想法,随着项目的继续,我实际上可能会用到它们。

答案是:经过大量搜索、注释代码和使用日志跟踪事物后,我终于找到了另一个相关的 performSelector,它在其他地方被调用,时间为 2 秒(因此,我认为显示的是 0.5 秒的增量在图像隐藏之间)。

简而言之……一个奇怪的编码错误。再次感谢!

于 2013-04-28T21:52:07.930 回答
0

想法[我首先想到了 2,但我怀疑 1 可以解决问题]:

1) 不要设置它们的隐藏属性,而是使用 UIView 动画在 100 毫秒的时间段内将它们的两个 alpha 值都变为 0,然后在完成块中,将它们的 hidden 属性设置为 YES 并将它们的 alpha 值重置回 1。

2) 不要立即隐藏这两个视图,而是创建一个新视图来覆盖它们。您甚至可以对它们下方的内容进行“快照”,并首先从中创建图像:

  • 创建一个图像,您可以临时使用它来覆盖要隐藏的两个图像。

  • 在适当的时候,将该视图作为最顶层视图添加到层​​次结构中。

  • 隐藏它下面的两个视图

  • 删除临时视图

于 2013-04-28T14:21:52.717 回答
0

我无法弄清楚为什么会发生这样的问题,但我可以使用 GCD 为您提供替代方案:

double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self hideThem];
});
于 2013-04-27T13:35:50.083 回答