2010-04-04 68 views
3

我在我的iPhone應用程序中有一個非常具體的「錯誤」。我爲按鈕的突出顯示和正常狀態設置了兩個圖像。它按預期的方式工作,當你「按下」,然後以緩慢的速度「接近」時,但如果你點擊/快速點擊它,狀態之間會有明顯的閃爍。這是一個已知的錯誤還是我錯誤地設置狀態?UIButton和UIControlEventState問題

下面是一個創建按鈕的代碼:

UIImage *normalImage = [[UIImage imageNamed:@"btn-small.png"] stretchableImageWithLeftCapWidth:10.0f topCapHeight:0.0f]; 
UIImage *highlightedImage = [[UIImage imageNamed:@"btn-small-down.png"] stretchableImageWithLeftCapWidth:10.0f topCapHeight:0.0f]; 

[self setBackgroundColor:[UIColor clearColor]]; 

[self setBackgroundImage:normalImage forState:UIControlStateNormal]; 
[self setBackgroundImage:highlightedImage forState:UIControlStateDisabled]; 
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted]; 

[self setAdjustsImageWhenDisabled:FALSE]; 
[self setAdjustsImageWhenHighlighted:FALSE]; 

當按鈕被簡單地拍了拍它禁用本身並啓用另一個按鈕:在這個快速點擊閃爍

- (IBAction)aboutButtonTouched:(id)sender 
{ 
    aboutButton.enabled = FALSE; 
    rulesButton.enabled = TRUE; 
} 

- (IBAction)rulesButtonTouched:(id)sender 
{ 
    rulesButton.enabled = FALSE; 
    aboutButton.enabled = TRUE; 
} 

有什麼想法?

回答

8

好的,我解決了這個問題。對我正在嘗試做的事情進行了一些逆向工程,但是我認爲我會發布我所做的事情以防別人幫助其他人。

我做的第一件事就是修改aboutButtonTouched方法記錄按鈕的狀態屬性,它是一個位掩碼NSUInteger:

- (IBAction)aboutButtonTouched:(id)sender 
{ 
    rulesButton.enabled = TRUE; 
    [sender setEnabled:FALSE];  

    NSLog(@"%d", [sender state]); 
} 

在這一點上,按鈕被通過的setEnabled禁用和日誌報告國家是「3」。查看UIControlState的位掩碼類型:

enum { 
    UIControlStateNormal    = 0,   // 0 
    UIControlStateHighlighted   = 1 << 0,  // 1 
    UIControlStateDisabled    = 1 << 1,  // 2 
    UIControlStateSelected    = 1 << 2,  // 4 
    UIControlStateApplication   = 0x00FF0000, 
    UIControlStateReserved    = 0xFF000000 
}; 

(註釋由於我永遠不會記住按位)。我們可以看到要獲得「3」(0011),我們應該使用UIControlStateHighlighted | UIControlStateDisabled(0001 | 0010或1 | 2),這是我在原始按鈕定義中沒有的狀態。這裏的關鍵是,在狀態剛剛被禁用之前(「控制在觸摸進入和退出過程中進入和退出過程中以及觸摸過程中出現這種狀態時 - 從文檔開始),有一段短暫的時間。所以對於按鈕的地方不閃爍最終狀態設置爲:

[self setBackgroundImage:normalImage forState:UIControlStateNormal]; 
[self setBackgroundImage:highlightedImage forState:UIControlStateDisabled]; 
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted]; 
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted|UIControlStateDisabled]; 
+0

我不知道爲什麼;但在iOS5測試中,它不是「3」而是「5」。哪個是「UIControlStateSelected | UIControlStateHighlighted」 – HansPinckaers 2011-11-17 17:02:31

+0

@HansPinckaers如果他們向位掩碼添加了新項目,則值可能已更改。 – typeoneerror 2011-11-17 17:21:02

+0

嗯,我只是子類UIButton並添加了一個方法來設置狀態1到5.沒有更多的閃爍:) – HansPinckaers 2011-11-19 13:50:02

0

也許你應該反向變化的按鈕

的序列當你第一次隱藏一個按鈕,然後顯示其他,也許有一點點差距,這就造成閃爍。我認爲最好先顯示其他按鈕。

+0

沒有運氣。同樣的交易。 – typeoneerror 2010-04-04 23:19:38

1

要注意的是,雖然沒有記錄,包含UIControlStateHighlighted|UIControlStateDisabled所有狀態的組合是無效的:這些都是相當於同一沒有UIControlStateDisabled

簡而言之:

(UIControlStateHighlighted | UIControlStateDisabled) == UIControlStateHighlighted

(UIControlStateSelected | UIControlStateHighlighted | UIControlStateDisabled) == (UIControlStateSelected | UIControlStateHighlighted)

我發現硬盤的方式:被設置爲其覆蓋我的設置爲高亮顯示+禁用狀態的一些屬性突出顯示的狀態。花了半天的時間來追蹤問題爲什麼按鈕沒有正確突出顯示...