[英]UIButton and UIControlEventState issue
我的iPhone應用程序中有一個非常具體的“錯誤”。 我正在為按鈕的突出顯示和正常狀態設置兩個圖像。 當你“按下”然后以慢速“觸摸”時它按預期工作,但是如果你快速點擊/點擊它,狀態之間會有明顯的閃爍。 這是一個已知的錯誤還是我錯誤地設置狀態?
這是創建按鈕的代碼:
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;
}
有關此快速點擊閃爍的任何想法?
好的,我解決了這個問題。 采取了一些逆向工程,我試圖做的,但我想我會發布我所做的,以防它幫助其他人。
我做的第一件事是修改aboutButtonTouched方法來記錄按鈕的state屬性,這是一個位掩碼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
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];
需要注意的是,盡管沒有記錄,但包含UIControlStateHighlighted|UIControlStateDisabled
所有狀態組合都無效:這些組合相當於沒有UIControlStateDisabled
狀態組合。
簡而言之:
(UIControlStateHighlighted | UIControlStateDisabled) == UIControlStateHighlighted
和
(UIControlStateSelected | UIControlStateHighlighted | UIControlStateDisabled) == (UIControlStateSelected | UIControlStateHighlighted)
我發現困難的方法是:為突出顯示+禁用狀態設置一些屬性,這些屬性覆蓋了突出顯示狀態的設置。 花了半天的時間來追蹤為什么按鈕沒有正確突出顯示的問題......
也許你應該改變更改按鈕的順序
- (IBAction)aboutButtonTouched:(id)sender
{
rulesButton.enabled = TRUE;
aboutButton.enabled = FALSE;
}
當你先隱藏一個按鈕然后顯示另一個按鈕時,可能會有一點間隙,這會產生閃爍。 我認為最好先顯示另一個按鈕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.