屏幕上的高亮按钮
问题描述:
即时通讯我试图在我的屏幕上突出按钮,我想改变他们的背景图像,等待几秒钟,恢复背景图像和下一个按钮相同。屏幕上的高亮按钮
从来就写了这个代码:
-(void)animateButtons
{
UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, scroll.frame.origin.y-20, [UIScreen mainScreen].bounds.size.width, 20)];
[lbl setTextAlignment:NSTextAlignmentCenter];
for(int c=0;c<arr.count&&animationRunning;c++)
{
MenuItem * m = [arr objectAtIndex:c];
[lbl setText:m.name];
MyButton * b = (MyButton*)[self.view viewWithTag:c+1];
NSMutableString * str = [[NSMutableString alloc]initWithString:m.image];
[str appendString:@"_focused.png"];
[b setBackgroundImage:[UIImage imageNamed:str] forState:UIControlStateNormal];
sleep(2.5);
str = [[NSMutableString alloc]initWithString:m.image];
[str appendString:@"_normal.png"];
[b setBackgroundImage:[UIImage imageNamed:str] forState:UIControlStateNormal];
if(c==arr.count-1)
{
animationRunning=false;
}
}
}
该方法其所谓的这种方式,所以它不阻塞UI线程。
[NSThread detachNewThreadSelector:@selector(animateButtons) toTarget:self withObject:nil];
但它只是改变第一个按钮的背景,然后什么也没有。
使用的NSLog我可以看到,该方法仍然在运行,但上的按钮没有变化。
我该如何做到这一点?
感谢和抱歉我的英语不好。
答
不能从后台线程改变UI的属性,这会导致各种问题,包括崩溃。为了保持您的原始算法,您可以将UI更新发送回主线程。但是这不是一个非常有效的线程使用,只需使用一个简单的NSTimer就可以在主线程上运行。
答
如前所述,在主线程上执行所有UI更改。这是一个完成你想要做的事情的选项,不需要NSTimer。
-(void)animateButtons
{
for (...)
{
// set focused state
}
[self performSelector:@selector(restoreButtons) withObject:nil afterDelay:2.5];
}
-(void)restoreButtons
{
for (...)
{
// set normal state
}
}
需要在主线程上对UI进行更改。如果在任何其他线程上进行创建,它们将产生不可预知的结果。你可以使用计时器来做同样的事情。 – Amar
有没有答案帮助你?如果是这样,请将其标记为已接受的答案,或者上传它是否有帮助,但不是正确的答案。这将帮助您建立声誉,并鼓励他人回答您的问题。否则,您可以对答案或您的问题发表评论以获得更多清晰度。谢谢! – stevekohls