如何在按下UIButton状态后将其设置为突出显示

时间:2011-08-29 12:23:04

标签: ios cocoa-touch uikit uibutton

我有一个典型的要求,我需要在按下后将按钮保持在突出显示的状态。我需要执行一项任务,该任务仅在按钮处于突出显示状态时才有效。实际上我正在设置按钮状态以编程方式突出显示。

[sender setHighlighted:YES];

一旦按钮处于突出显示状态,我需要执行另一个操作。

- (IBAction)changeState: (UIButton*)sender
{   
    if (sender.highlighted == YES)
    {
        [self performSomeAtion:sender];
    }
}

但是,令我恐惧的是,无论何时按下任何按钮,上述情况都会变为真实,并且正在重复执行操作。有什么方法可以让我在按下它之后保持UIButton的状态突出显示?

编辑 - 实际上我需要为按钮的3种不同状态执行3种不同的操作。我已经在使用选定的状态和正常状态了。现在,我需要利用突出显示的状态。

10 个答案:

答案 0 :(得分:17)

[sender setSelected:YES]; 

或者您可以使用UIButton的两个图像(notselectedimage.pngselectedimage.png)来模拟此效果,然后使用BOOL变量(例如BOOL buttonCurrentStatus;)跟踪按钮状态。然后在.h文件中:

BOOL buttonCurrentStatus;

和.m文件

// connect this method with Touchupinside function
- (IBAction)changeState:(UIButton*)sender
{
    /* if we have multiple buttons, then we can
       differentiate them by tag value of button.*/
    // But note that you have to set the tag value before use this method.

  if([sender tag] == yourButtontag){

    if (buttonCurrentStatus == NO)
    {
        buttonCurrentStatus = YES;
        [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal];
        //[self performSomeAction:sender];
    }
    else
    {
        buttonCurrentStatus = NO;
        [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal];
        //[self performSomeAction:sender];
    }   
  }
}

答案 1 :(得分:7)

- (void)mybutton:(id)sender
{
    UIButton *button = (UIButton *)sender;
    button.selected = ![button isSelected]; // Important line
    if (button.selected)
    {
        NSLog(@"Selected");
        NSLog(@"%i",button.tag);
    }
    else
    {
        NSLog(@"Un Selected");
        NSLog(@"%i",button.tag);

    }
 }

答案 2 :(得分:4)

突出显示的状态用于在触摸时突出显示按钮。按钮中的触碰事件突出显示它。您应该使用“选定”状态。

如果要执行的操作是在按下按钮后执行操作,请不要将方法附加到状态更改事件,请将方法附加到TouchUpInside事件。

答案 3 :(得分:3)

我找到了一种方法,所以我分享一下,以防万一...

我保留了我的UIButton并为每个状态设置了一个图像(因此你可以进入4状态按钮)。 我将UserInteractionEnabled设置为NO - >此按钮不会接收任何触摸。 第一个按钮的目的是显示状态

我使用与第一个相同的框架创建第二个自定义UIButton。对于这个,没有为状态设置图像(它是一个完全透明的按钮)。此按钮的目的是捕捉触摸事件。所以我在TouchUpInside事件上为此按钮添加了一个目标。然后当事件被触发时,我将第一个按钮的状态更改为Disabled,Highlighted,Selected或者没有这些状态(= Default state)。

一切都像魅力一样!

答案 4 :(得分:2)

你描述它的方式,你最好将UIView子类化为创建你自己的三态按钮。

实际上,您甚至应该实现自己的多状态buttonView,并通过PNG数组内部管理其状态,以及状态数组,以了解它被按下的次数。

答案 5 :(得分:1)

使用[sender setSelected: YES];,我认为它对您有用。

答案 6 :(得分:0)

UIButton *btn_tmp=sender;
    if(!(btn_tmp.selected))
    {
[btn_temp setHighlighted:YES];

}

答案 7 :(得分:0)

仅适用于iOS 7:您应该考虑将图像renderMode设置为UIImageRenderingModeAlwaysTemplate。然后,您可以使用tintColor表示各种状态。

How to apply a tintColor to a UIImage?

请参阅Tint a UIView with all its subviews

答案 8 :(得分:0)

解决方案很棘手,但这是可能的。

问题是您尝试更改按钮操作方法中突出显示的状态,我想在操作结束时进行清理或检查过程并切换突出显示的状态。当你尝试调试它时,你会得到突出显示的= 1但它会在最后改变。

奇怪但你的" 3状态按钮"当你想要一个按钮突出显示时,它有时很有用。模式类似于"选择"模式根据3种状态获取不同的操作。 唯一的问题是你无法分析这个问题或者在按钮操作方法中将其切换到高亮模式,因为当用户按下它时会立即切换到高亮模式并在结束时将其切换回来。

解决方案是使用调度。

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [theButton setHighlighted:YES];
});

这样做可以使用3种状态。

答案 9 :(得分:0)

根据苹果的说法,UIButton的属性为imageView

  

虽然此属性是只读的,但它自己的属性是可读/写的。使用这些属性来配置按钮视图的外观和行为

这意味着您可以在IB(在故事板中)设置此按钮的图片并设置突出显示的图片:

  1. 打开“属性”检查器。
  2. 按钮部分下,选择一张图片。
  3. 在同一部分中,将状态配置更改为突出显示。请注意,您在默认情况下选择的图像现已消失,现在您可以为突出显示设置新图片。
  4. 现在你有一个带有2状态配置的按钮,你需要在运行时更改button.highlighted = true。另外,请查看配置控件的属性下的UIControl以获取更多状态。
  5. 您也可以按照以下方式编程:

    Swift(在Objective-C中几乎相同):

    // Setting the highlighted image
    self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest")
    // someButton will now some the highlighted image and NOT the image set in the IB
    self.someButton.imageView?.highlighted = true