【问题标题】:How to have a UIButton image change when a button is touched触摸按钮时如何更改 UIButton 图像
【发布时间】:2013-01-08 11:02:33
【问题描述】:

我正在尝试在触摸按钮时更改 UIButton 图像。目前我它改变了,但只在突出显示的状态改变。我希望它改变并留在那里。我尝试 UIControlStateSelected 进行状态更改,但没有运气。

感谢您的帮助

这是我的代码:

 // Create buttons for the sliding category menu.
    NSMutableArray* buttonArray = [NSMutableArray array];
    NSArray * myImages = [NSArray arrayWithObjects:@"category-cafe-unsel.png", @"category-food-unsel.png", @"category-clothing-unsel.png", @"category-health-unsel.png", @"category-tech-unsel_phone.png" , @"category-tech2-unsel.png", @"catefory-theatre-unsel.png", @"category-travel-unsel.png", nil];

    NSArray * myImagesSel = [NSArray arrayWithObjects:@"category-cafe-sel.png", @"category-food-sel.png", @"category-clothing-sel.png", @"category-health-sel.png", @"category-tech-sel_phone.png" , @"category-tech2-sel.png", @"catefory-theatre-sel.png", @"category-travel-sel.png", nil];

    // only create the amount of buttons based on the image array count
    for(int i = 0;i < [myImages count]; i++)
    {
        // Custom UIButton

        btn = [UIButton buttonWithType:UIButtonTypeCustom];

        [btn setFrame:CGRectMake(0.0f, 20.0f, 52.0f, 52.0f)];
        [btn setTitle:[NSString stringWithFormat:@"Button %d", i] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:[myImagesSel objectAtIndex:i]] forState:UIControlStateHighlighted];

        NSLog(@"The button title is %@ ", btn.titleLabel.text);

        [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
        [buttonArray addObject:btn];

【问题讨论】:

    标签: objective-c ios uibutton uicontrol


    【解决方案1】:

    在您的 IBAction 方法中添加以下行:

     - (IBAction)change:(id)sender
     {
       UIButton *button = (UIButton *)sender;
       int tagOfButton = button.tag - 1;
       [button setImage:[UIImage imageNamed:[myImagesSel objectAtIndex:tagOfButton]] forState:UIControlStateNormal];
     }
    

    在你的 for 循环中添加一行:

    for(int i = 0;i < [myImages count]; i++)
    {
        // other stuffs
        btn.tag  = i+1;
    }
    

    编辑:

    如果您需要在单击其他按钮时撤消之前的选择:

    在您的 IBAction 方法中编写此循环。

    for(int i = 0;i < [myImages count]; i++)
    {
      UIButton *but = (UIButton *)[buttonArray objectAtIndex:i];
      if(but != button)
      {
           [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateNormal];
      }
    }
    

    或者简单地将前一个按钮标签存储到一个变量中。 并用它来更改未完成的图像更改。

    【讨论】:

    • 谢谢。它正在切换图像-因此显示错误的图像。它们似乎是一个关闭,而不是图像数组中的第一个项目显示第二个项目。当另一个按钮被触摸时,状态也不会被撤销。谢谢你的帮助:)
    • 我把代码改成了 int tagOfButton = button.tag - 2;现在显示正确的图像。当触摸另一个按钮时,我只是让它们返回默认值。 :)
    • @hanumanDev:您是否在 IBAction 方法中编写了上述代码?循环是否正常工作?
    【解决方案2】:
    [btn setTitle:@"I'm not selected" forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:[myImages objectAtIndex:i]] forState:UIControlStateNormal];
    [btn setTitle:@"I'm selected" forState:UIControlStateSelected];
    [btn setImage:[UIImage imageNamed:[myImagesSel objectAtIndex:i]] forState:UIControlStateSelected];
    
    [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    
    -(IBAction)buttonPressed:(id)sender {
      btn.selected = !btn.selected;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多