如何在按下UIButton后将其状态设置为高亮状态

14

我有一个典型的需求,需要在按下按钮后保持其高亮状态。 我需要执行一个任务,只有当按钮处于高亮状态时才能正常工作。实际上,我是通过编程设置按钮状态为高亮。

[sender setHighlighted:YES];

一旦按钮处于高亮状态,我需要执行另一个操作。

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

但是,令我感到恐惧的是,每当我按下任何按钮时,上述条件都变为真,并且动作会被重复执行。有没有办法在按下UIButton后保持其高亮状态?

编辑 - 实际上,我需要执行3个不同状态的按钮的3个不同操作。 我已经使用选定状态和正常状态。 现在,我需要使用高亮状态。


您可以设置一个BOOL变量,一旦操作完成就会更新为TRUE。 - alloc_iNit
但我需要将按钮设置为高亮状态,并且它必须保持在高亮状态,除非我再次更改它。 - A for Alpha
仅适用于iOS 7,您应该考虑将图像的renderMode设置为UIImageRenderingModeAlwaysTemplate,然后使用Tint颜色来表示各种状态。请参见https://dev59.com/dmIj5IYBdhLWcg3w4Ivt - John Henckel
10个回答

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];
    }   
  }
}

谢谢你的回答,Vijay。如果我只有一个按钮,你的答案很好用。但是我的情况比较复杂。我有多个按钮,应该为3种状态执行3个动作。有什么建议吗???对你的答案点赞+1... - A for Alpha
UISegmentControl 你知道的。使用它。如果你需要更多帮助,请回复。http://www.mobisoftinfotech.com/blog/iphone/iphone-segmented-controluisegmentedcontrol-tutorial/ - Vijay-Apple-Dev.blogspot.com
2
如果你有多个按钮,你所需要做的就是采取Vijay的答案,并通过在你的按钮上添加 tag 来调整它,然后执行以下操作... UIButton *button = (UIButton*)sender; if (button.tag == 1) ... - Scott Lieberman

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);

    }
 }

5

高亮状态是在按钮被触摸时用来强调按钮的状态。按钮的按下事件会使其高亮显示。建议使用“选中”状态。

如果你想在按钮被按下后执行一个操作,不要将你的方法附加到状态更改事件上,而应该将其附加到TouchUpInside事件上。


+1 个赞,非常好的解释。实际上我需要针对按钮的三种不同状态执行三个不同的操作。这就是我遇到困难的地方...任何帮助将不胜感激(请检查我更新的问题)。 - A for Alpha

3

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

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

我创建了第二个自定义UIButton,其框架与第一个相同。对于这个,不会为状态设置任何图像(它是完全透明的按钮)。该按钮的目的是捕获触摸事件。因此,我在TouchUpInside事件上为该按钮添加了一个目标。然后当事件被触发时,我更改第一个按钮的状态为禁用,突出显示,选中或没有这些状态(=默认状态)。

一切都像魅力一样运作!


2

根据您的描述,您最好通过子类化UIView来创建自己的三态按钮。

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


1

使用 [sender setSelected: YES];,我认为它对你会有帮助。


就像我在问题中提到的那样,我需要使用按钮的高亮状态而不是选定状态。 - A for Alpha
UIButton *btn_tmp=sender;if(!(btn_temp.selected)){//当按钮从未被选中时为真 - Narayana Rao Routhu

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

}

我已将按钮设置为高亮状态。但是,当我尝试检查按钮的状态时,我无法获得确切的状态。我猜想当我按下同一个按钮时,状态从高亮变成了其他状态...有没有办法找到那个状态呢,Narayana? - A for Alpha

0

解决方案有些棘手,但是可以实现。

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

奇怪的是,您的“3个状态按钮”有时很有用,当您想保持按钮处于“突出显示”模式(如“选定”模式)以根据3个状态获得不同的操作时。唯一的问题是,您无法在按钮操作方法中分析或将其切换到突出显示模式,因为这会立即将其切换到突出显示模式,并在结束时将其切换回来。

解决方案是使用dispatch。

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种状态。


0

根据苹果公司的说法,UIButton具有imageView属性:

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

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

  1. 打开属性检查器。
  2. 按钮部分下选择一个图像。
  3. 在同一部分中,将状态配置更改为高亮。注意,在默认情况下选择的图像现在已经消失了,现在您可以为高亮设置新的图片。
  4. 现在您拥有一个具有2个状态配置的按钮,并且在运行时只需更改button.highlighted = true即可。此外,请查看配置控件属性下的UIControl以获取更多状态。

您还可以按以下方式进行编程:

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接