簡體   English   中英

UIButton和UIControlEventState問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM