2011-10-02 63 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]; 
    } 

} 
相關問題