2011-08-29 25 views
14

我有一个典型的要求,在按下按钮后,我需要将按钮保持为高亮状态。我需要执行一个只有在按钮处于高亮状态时才能工作的任务。其实我正在设置一个按钮状态以编程方式突出显示。如何将UIButton状态设置为在按下后突出显示

[sender setHighlighted:YES];

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

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

但是,我的恐惧,每当我按任何按钮,上述条件正在逐步成为现实,并正在反复进行动作。有什么办法可以让UIButton的状态在按下后突出显示?

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

+0

你可以设置一个布尔变量将更新为TRUE一旦行动已经执行。 –

+0

但我需要将按钮设置为突出显示状态,除非我再次更改它,否则它必须保留在突出显示的状态中。 –

+0

仅适用于ios 7,应考虑将图像renderMode设置为UIImageRenderingModeAlwaysTemplate,然后使用Tint颜色表示各种状态。请参阅http://stackoverflow.com/questions/19802982/apply-tintcolor-to-uiimage –

回答

4

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

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

+0

+1以获得很好的解释。其实我需要为按钮的3种不同状态执行3种不同的操作。这是我卡住的地方..任何帮助将不胜感激(请检查我更新的问题) –

1

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

+0

喜欢它在我的问题中提到,我需要使用按钮的高亮显示的状态,而不是选定的状态。 –

+0

UIButton * btn_tmp = sender; if(!(btn_temp.selected)){//它真的当按钮没有被选中时 } – Narayana

15
[sender setSelected:YES]; 

,或者你可以模拟两个形象,为您的UIButton(notselectedimage.pngselectedimage.png)这样的效果,然后跟上像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]; 
    } 
    } 
} 
+0

感谢您的答案vijay ..您的答案正常工作,如果我有一个按钮。但是我的情况有点复杂。我有多个按钮应该执行3个州的行动..任何建议? +1为你的答案太... –

+0

UISegmentControl你知道,如果你想获得更多的帮助,然后回复.http://www.mobisoftinfotech.com/blog/iphone/iphone-segmented-controluisegmentedcontrol-tutorial/ –

+2

如果你有多个按钮,所有你需要做的就是采取Vijay的答案,并通过添加'标记'到你的按钮,然后做...调整它... 'UIButton * button =(UIButton *)sender;' 'if(button。标记== 1)...' –

2

你描述它的样子,你会更好UIView的子类来创建自己的三种状态的按钮。

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

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

} 
+0

我已将按钮设置为突出显示状态。但是,当我尝试检查按钮的状态时,我无法得到确切的状态。我猜测当我按下相同的按钮时,状态从突出显示变为另一种。有没有什么办法可以找到那个narayana ?。 –

3

我只是找到一种方法,让我分享它,以防万一......

我一直在我的UIButton并为每个状态设置一个图片(所以你可以去到一个4个状态按钮)。 我将UserInteractionEnabled设置为NO - >此按钮不会收到任何触摸。 这个第一个按钮的目的是显示一个状态

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

一切工作就像一个魅力!

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

    } 
} 
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个状态。

0

据苹果的UIButton有imageView属性:

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

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

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

你也可以做到这一点编程方式如下:

斯威夫特(和在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 
相关问题