当用户按下该按钮时,我想更改UIButton上的图像。所以,我写了
btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal];
之后我更改了视图。
图像正在改变,但没有显示已更改的图像。我认为控制器会转到下一个视图,这就是它发生的原因。但我想表明改变,我该怎么做? Plz帮我这个..
答案 0 :(得分:97)
我正在使用Interface Builder,其中我在视图中添加了UIButton
。
我默认定义了按钮选择,并为选中状态选择了我的图像(使用检查器窗口中的下拉列表选择“选择状态配置“选择图像之前”。
在控制器中创建IBAction
并将按钮连接到该操作。
然后看下面的代码:
-(IBAction) toggleUIButtonImage:(id)sender{
if ([sender isSelected]) {
[sender setImage:unselectedImage forState:UIControlStateNormal];
[sender setSelected:NO];
} else {
[sender setImage:selectedImage forState:UIControlStateSelected];
[sender setSelected:YES];
}
}
我认为这是一个非常顺利的解决方案。希望它有所帮助!
答案 1 :(得分:22)
这是我做的最简单的方式,每次都有效
-(void)buttonTouched:(id)sender
{
UIButton *btn = (UIButton *)sender;
if( [[btn imageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"icon-Locked.png"]])
{
[btn setImage:[UIImage imageNamed:@"icon-Unlocked.png"] forState:UIControlStateNormal];
// other statements
}
else
{
[btn setImage:[UIImage imageNamed:@"icon-Locked.png"] forState:UIControlStateNormal];
// other statements
}
}
您可以对其他状态使用其他类似检查,例如SELECTED,ENABLED,HIGHLIGHTED。
答案 2 :(得分:11)
你在那里的代码应该可以正常工作,但我猜测按钮图像在下一次运行事件循环之前似乎没有改变,因此在视图切换之前你没有看到它。 / p>
这是一种黑客攻击,但您可以尝试稍微延迟视图更改,以便按钮更新。
所以不要这样:
[btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal];
[self showMyOtherView];
试试这个:
[btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal];
[self performSelector:@selector(showMyOtherView) withObject:self afterDelay:0.01];
答案 3 :(得分:5)
要更改所选状态的图像,您必须为状态setImage
调用UIControlStateSelected
。您可以为不同的状态设置单独的图像(正常,突出显示,禁用,选择等)。
答案 4 :(得分:3)
如果您想在单击按钮时更改图像,这种方式非常有效:
-(IBAction)buttonClicked: (id)sender
{
UIButton *buttonObj = (UIButton*)sender;
[buttonObj setBackgroundImage:[UIImage imageNamed:@"myImage.png"]
forState:UIControlStateNormal];
}
答案 5 :(得分:2)
实现此目的的最简单方法是在Interface Builder中设置突出显示的图像。
答案 6 :(得分:2)
以Nicsoft的回答为基础。
-(void)viewDidLoad {
[super viewDidLoad];
[self.button setImage:[UIImage imageNamed:@"unselectedImageName"] forState:UIControlStateNormal];
[self.button setImage:[UIImage imageNamed:@"selectedImageName"] forState:UIControlStateSelected];
}
-(IBAction)toggleButton:(UIButton *)sender {
sender.selected = !sender.selected;
// Add logic here
}
答案 7 :(得分:1)
我编写的代码昨晚完全正确,我没有采取任何奇怪的拖延策略。在这种特殊情况下,我是在tableViewCell中进行的。这比你要求的代码多,但它显示了我使用的整个过程。如您所见,我选择在按钮触摸期间没有任何特殊图像。
// Button set up, inside cellForRowAtIndexPath:
// imageFrame is just the rect that you want the button to occupy
[self setFavorite:[[UIButton alloc] initWithFrame:imageFrame]];
[[self favorite] addTarget:self action:@selector(toggleFavorite:)
forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:[self favorite]];
[self draw];
// definition of the callback specified above
- (void) toggleFavorite:(id) sender {
if (favoriteState == 0 ){
favoriteState = 1;
} else {
favoriteState = 0;
}
[self draw];
}
// the draw method, to set the images
// favOn and favOff are statically defined at the top of the class
- (void) draw {
if (favoriteState != 0) {
[[self favorite] setBackgroundImage:favOn forState:UIControlStateNormal];
[[self favorite] setBackgroundImage:favOn forState:UIControlStateHighlighted];
} else {
[[self favorite] setBackgroundImage:favOff forState:UIControlStateNormal];
[[self favorite] setBackgroundImage:favOff forState:UIControlStateHighlighted];
}
}
答案 8 :(得分:0)
讨厌添加过多的答案,但是:
连接IBAction并保持简单。
@IBAction func buttonTapped(sender: UIButton){sender.selected = !sender.selected}
完成。