2011-08-29 106 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 
相關問題