屏幕上的高亮按钮

问题描述:

即时通讯我试图在我的屏幕上突出按钮,我想改变他们的背景图像,等待几秒钟,恢复背景图像和下一个按钮相同。屏幕上的高亮按钮

从来就写了这个代码:

-(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我可以看到,该方法仍然在运行,但上的按钮没有变化。

我该如何做到这一点?

感谢和抱歉我的英语不好。

+0

需要在主线程上对UI进行更改。如果在任何其他线程上进行创建,它们将产生不可预知的结果。你可以使用计时器来做同样的事情。 – Amar

+0

有没有答案帮助你?如果是这样,请将其标记为已接受的答案,或者上传它是否有帮助,但不是正确的答案。这将帮助您建立声誉,并鼓励他人回答您的问题。否则,您可以对答案或您的问题发表评论以获得更多清晰度。谢谢! – stevekohls

不能从后台线程改变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 
    } 
}