2014-01-17 18 views
3

我試圖創建一個按鈕,只需輕觸它即可從normal狀態切換到selected狀態,反之亦然。但是,我沒有設法使其工作。這裏是我的代碼:爲什麼在釋放我的手指之前,我的UIButton的選定狀態沒有被觸發?

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIButton *button = [UIButton new]; 
    [button setImage:[UIImage imageNamed:@"touch_normal.png"] forState:UIControlStateNormal]; 
    [button setImage:[UIImage imageNamed:@"touch_selected.png"] forState:UIControlStateSelected]; 

    button.frame = CGRectMake(138.5, 208.5, 63, 63); 
    [button addTarget:self action:@selector(touch:) forControlEvents:UIControlEventTouchDown]; 
    button.adjustsImageWhenHighlighted = NO; 

    [self.view addSubview:button]; 
} 

- (void)touch:(id)sender 
{ 
    NSLog(@"Touch"); 

    UIButton *button = sender; 

    if (button.selected) 
     button.selected = NO; 
    else 
     button.selected = YES; 
} 

@end 

當我點擊並按住,就會觸發touch方法,符合市場預期。但是,釋放手指後,該按鈕的圖像僅更改爲touch_selected.png。任何想法可能是什麼問題?

編輯:我知道什麼是UIControlStateHighlighted,它是不是我要找的,因爲我希望我的按鈕切換到selected狀態後,我摸了一下(但同時,我還拿着我的手指上),並且在我將手指從屏幕上移開後它應該保持在selected狀態。

回答

4

您可能想要更改突出顯示狀態的圖像。

您應該不需要在touch:方法中執行任何操作。

只需更改行:

[button setImage:[UIImage imageNamed:@"touch_selected.png"] forState:UIControlStateSelected]; 

爲:

[button setImage:[UIImage imageNamed:@"touch_selected.png"] forState:UIControlStateHighlighted]; 

然後,當按鈕被觸摸的圖像應該改變。

編輯:

要使按鈕保持圖像一旦觸摸已經發布了,你基本上是希望在每次觸摸按鈕釋放時間反轉選擇的狀態。 我建議增加一個目標按鈕:

[myButton addTarget:self action:@selector(buttonPushed) forControlEvent:UIControlEventTouchUpInside]; 

然後在該方法中,反轉選中狀態:

- (void)buttonPushed 
{ 
    [myButton setSelected:!myButton.selected]; 
} 

這應該希望做的伎倆!

+0

對不起,非常清楚。看我的編輯。 –

+0

這實際上是我現在正在做的。 :)(除了我在'buttonPushed'方法中使用'if'語句,因爲它是一個學校項目,它使它更具可讀性) –

0

因爲你要求這樣做。選擇按鈕時,您正在更改圖像。如果您想在用戶觸摸時更改圖像,然後將圖像設置爲UIControlStateHighlighted,則當button將處於highlighted狀態時,它將更改圖像。

+0

但是,當我觸摸按鍵,觸摸':'方法被觸發(我用'NSLog'驗證),其改變我的按鈕的'selected'屬性。 –

+0

另請參閱我的編輯。 –

+0

但這不是選定的狀態,這是突出顯示的狀態...您選擇的設置,但它會在您釋放它時生效...如果您點擊並保持它,突出顯示的狀態... –

0

UIControlStateSelected並不意味着你的想法。點擊時選擇一個控件。當您點擊並按住該控件時,然後從該控件拖出,該控件未被選中。您正在尋找UIControlStateHighlighted。設置selected屬性也是不必要的。 UIButton會照顧到這一點。

+0

請參閱我的編輯。我不是很清楚,對不起。 –

0

該按鈕還有一個highlighted狀態(視覺上)覆蓋了selected狀態。突出顯示的狀態在內部保持顯示。

+0

哦,我不知道。任何想法如何我可以解決這個問題? (或不應該我?) –

2

對於你正在努力實現的,你應該使用:UIControlStateHighlighted沒有UIControlStateSelected

選擇是當用戶完成與它進行交互,而高亮顯示的是當用戶正在與其進行交互。我認爲你錯誤地解釋了Ui控制狀態流程。

編輯: 你似乎對這裏玩的底層邏輯感到困惑。讓我試着解釋一下。

有3種狀態:

  • A - 未選擇
  • 乙 - 突出
  • Ç - 選擇

你做了什麼是告訴你的控制,使用國家特定的圖像A和C,然後告訴它不要像它通常在狀態B中那樣反應。然後,您告訴它,而狀態B轉換到狀態C.

這與所有按鈕內部的邏輯衝突。你不能這樣做。

您需要爲狀態A和B指定圖像,並且如果您需要在此之後選擇圖像,則需要在釋放手指後執行此操作。釋放手指後,內部邏輯將切換其狀態,因爲它不再處於它所處的狀態,並且需要移除突出顯示的狀態。它忽略了您已將其設置爲選中的事實。

如果不適合你,你需要創建自己的按鈕

+0

在我添加該行代碼之前,該按鈕顯示一個突出顯示的狀態,我不想要。因此,我添加了這條線來防止這種情況發生。 –

+0

@timvermeulen好吧,我的其餘部分仍然站在,但我會編輯並刪除 –

+0

我認爲你是曲解我的意圖。我想讓按鈕在觸摸後更改爲選定的更改(因此在我仍握住它時應該更改),並且在鬆開手指後它應該保持在選定狀態。 –

相關問題