2011-10-02 66 views
0

我在我的iPhone 4应用程序的界面生成器中设置了一个样式为“Info Dark”的UIButton。该按钮的其中一个属性是“高亮显示”,它在按钮周围显示白色高光。iPhone iOS 4 UIButton切换突出显示的状态

我想打开或关闭此白色高亮显示,指示按钮功能是否激活。

的按钮用于“润色内部”事件在界面生成器与此回调链接:

infoButton.highlighted = !infoButton.highlighted; 

第一触摸后,高亮消失,因为我希望它不会切换。我还需要做什么才能使高亮切换并显示按钮的状态?

谢谢!

更新: 当从界面生成器加载,按钮保持突出显示,即使在视图出现/消失。导致这种情况发生的原因是“显示突出显示”界面构建器属性。如果我将上面的代码分配给另一个按钮,info按钮将按照预期高亮显示和关闭。然而,信息按钮本身的触摸干扰与上面的代码,从而使按钮失去“触摸”高亮

更新2:我添加另一个信息按钮,正下方的第一信息按钮,在界面建设者,并永久发光。为了创建切换的外观,我隐藏并取消隐藏实际下方的glowInfoButton。这按预期工作:

infoButton.highlighted = NO; 
    glowInfoButton.highlighted = YES; 
    glowInfoButton.enabled = NO; 
    glowInfoButton.hidden = YES; 

- (IBAction)toggleInfoMode:(id)sender { 
// infoButton.selected = !infoButton.selected; 
    glowInfoButton.hidden = !glowInfoButton.hidden; 
} 

回答

0

现在,我看到你真的是在我建议子类UIButton并检查一个事件的调用,然后切换高亮状态相应。您可以在不添加虚拟按钮的情况下执行此操作

在自定义按钮实现文件的地方

下面的代码,或类似:

#import "HighlightedButton.h" 

@implementation HighlightedButton 

BOOL currentHighlightState; 

-(void)toggleHighlight:(id)sender { 
    self.highlighted = currentHighlightState; 
} 

-(void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event { 
    //get the string indicating the action called 
    NSString *actionString = NSStringFromSelector(action); 
    //get the string for the action that you want to check for 
    NSString *touchUpInsideMethodName = [[self actionsForTarget:target forControlEvent:UIControlEventTouchUpInside] lastObject]; 

    if ([touchUpInsideMethodName isEqualToString:actionString]){ 
    //toggle variable 
    currentHighlightState = !currentHighlightState; 
    //allow the call to pass through 
    [super sendAction:action to:target forEvent:event]; 
    //toggle the property after a delay (to make sure the event has processed) 
    [self performSelector:@selector(toggleHighlight:) withObject:nil afterDelay:.2]; 
    } else { 
    //not an event we are interested in, allow it pass through with no additional action 
    [super sendAction:action to:target forEvent:event]; 
    } 

} 

@end 

这是一个快速运行在一个妥善的解决办法,对切换闪烁,你可能不喜欢。我相信如果你玩弄一些可以纠正的变化。我尝试过,实际上也喜欢你的陈述案例。

1

突出显示的属性不起作用,按钮不切换。

这只是知道按钮是否被按下,如果我是正确的。

如果你想实现该功能,我建议你继承UIButton或UIControl。

+0

当我设置在界面生成器高亮显示的属性,突出岿然不动,这让我相信,我可以把它留在莫名其妙。 –

0

也许你真正想要的是

infoButton.enabled = NO; 

这将昏暗的按钮,当设置为禁用无接触,允许在正常操作时设定为YES。

或在您的情况:

infoButton.enabled = !infoButton.isEnabled; 

切换的相同的可用性。

如果你把它放在你的touchupinside事件中,当然它只会在第一次工作。之后被禁用并且不会收到触摸事件。你会把它放在另一个决定是否启用按钮的方法中。

如果您真的希望每次按下按钮时都更改它,那么您可能应该使用开关,或者您可以查看-imageForState,-setTitle:forState和/或-setTitleColor:forState方法。如果你想在每次触摸时切换外观,你可以改变它们。

+0

我在想是这样的:一个小的,不显眼的UIButton在我的视图控制器的角落信息黑暗风格。当它被触摸并“切换”时,视图控制器上的所有控件进入“信息”模式,显示一个弹出窗口来描述它们的功能。这就是为什么我真的希望按钮保持突出显示并且可以“打开”和“关闭”,启用和禁用此帮助模式。 –

+0

我自己,我会成立了由所建议的交换上的按钮图像,以做到这一点的可能性最大。我看到您的更新,并且您现在正在获得理想的结果。当你不使用它作为除了外观之外的任何东西时,对我来说使用另一个按钮似乎是错误的。如果有效,谁可以争论。 –

3

Highlighted图像是当被按压的UIButton显示内容,并且UIButton的本身内被控制。

您正在寻找的Selected财产。您可以在IB集合中选择图像,然后把infoButton.selected = !infoButton.isSelected;在TouchUpInside回调。

0

一个UIButton的高亮显示的状态下简单地设置按钮的阿尔法0.5F。因此,如果您将按钮设置为不突出显示,那么只需在0.1到0.5之间切换alpha。

例如:

- (void)buttonPressed:(id)sender { 

    if((((UIButton*)sender).alpha) != 1.0f){ 

     [((UIButton*)sender) setAlpha:1.0f]; 
    } else { 
     [((UIButton*)sender) setAlpha:0.5f]; 
    } 

} 
相关问题