【问题标题】:Change UIImage from UIButton after x seconds in iOS在 iOS 中 x 秒后从 UIButton 更改 UIImage
【发布时间】:2013-12-17 16:21:27
【问题描述】:
我正在尝试在 1 秒后从 uibutton 更改 uiimage。我试过用
来睡眠线程
[button1 setImage:[UIImage imageNamed:@"sameThing.png"] forState:UIControlStateNormal];
[NSThread sleepForTimeInterval:1];
[button1 setImage:[UIImage imageNamed:@"interrogation.png"] forState:UIControlStateNormal];
但是图像没有变化,线程正常执行
感谢您的建议
【问题讨论】:
标签:
ios
iphone
objective-c
uibutton
uiimage
【解决方案1】:
试试这个
[self performSelector:@selector(updateBtnImage:)
withObject: someObject
afterDelay:1];
-(void) updateBtnImage: (id) obj
{
//Set image here
//If still not updating image here dispatch block on main thread manually like this
dispatch_async(dispatch_get_main_queue(),
^{
//Set image in this block
});
}
【解决方案2】:
这不是你在 iOS 上做这些事情的方式。首先,让主线程休眠是个坏主意。您将阻止(冻结)应用程序的用户界面一秒钟。相反,您必须安排稍后执行第二个方法调用。
你可以定义一个新方法:
- (void)updateButtonWithImageNamed:(NSString *)imageName {
[button1 setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
}
然后像这样安排它:
[self performSelector:@selector(updateButtonWithImageNamed:)
withObject:@“interrogation.png"
afterDelay:1.0f];
【解决方案3】:
作为performSelector:WithObject:afterDelay 的替代品,您可以使用GDC 的dispatch_after:
[button1 setImage:[UIImage imageNamed:@"sameThing.png"] forState:UIControlStateNormal];
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[button1 setImage:[UIImage imageNamed:@"interrogation.png"] forState:UIControlStateNormal];
});
当您输入dispatch_after 时,Xcode 中已经定义了一个 sn-p 来执行此操作。
好处是您不必定义新方法。缺点是you must be careful with retain circles in your blocks。