当用户在iPhone上按下该按钮时,在UIButton上更改图像

时间:2009-07-02 05:48:18

标签: iphone objective-c

当用户按下该按钮时,我想更改UIButton上的图像。所以,我写了

btnthumbnail2 setImage:[UIImage imageNamed:@"leaderboard_ov.png"] forState:UIControlStateNormal];

之后我更改了视图。

图像正在改变,但没有显示已更改的图像。我认为控制器会转到下一个视图,这就是它发生的原因。但我想表明改变,我该怎么做? Plz帮我这个..

9 个答案:

答案 0 :(得分:97)

我正在使用Interface Builder,其中我在视图中添加了UIButton

  1. 我默认定义了按钮选择,并为选中状态选择了我的图像(使用检查器窗口中的下拉列表选择“选择状态配置“选择图像之前”。

  2. 在控制器中创建IBAction并将按钮连接到该操作。

  3. 然后看下面的代码:

  4.   -(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)

讨厌添加过多的答案,但是:

  1. 在IB中选择图像作为按钮的默认和选定状态。
  2. 连接IBAction并保持简单。

    @IBAction func buttonTapped(sender: UIButton){sender.selected = !sender.selected}

  3. 完成。