2011-01-31 70 views
2

更新:隨着羞恥的臉紅,我發現訂單與竊聽速度無關。在超級touchesEnded:withEvent調用之前,我正在調用視覺代碼,這就是爲什麼如果你點擊得非常快,顯示器再也沒有機會繪製突出顯示的狀態,然後再次被解散。因爲實際上導致主線程阻塞幾毫秒的代碼,突出顯示的狀態將保持可見狀態,直到主線程再次解除阻塞爲止,在這種情況下,如果您敲擊得非常快,看起來好像什麼也沒有發生。將超級調用移至覆蓋的方法的頂部可以解決所有問題。對不起,如果任何版主看到這個帖子,它可以被刪除。 爲什麼touchesBegan,target-action和touchesEnded的執行順序會隨着UIButton的快速觸碰而改變?

這個問題必須被問過1000次在SO,但我找不到解釋來匹配我的具體問題。

我有一個定製設計的UIButton子類。當然,這個設計足夠定製,我不能只使用常規的setSomething:forControlState:方法。我需要觸摸不同的背景顏色,以及需要閃爍的一些圖標。在調用它們各自的超級方法之前,爲了實現這些視圖更改,我(反直覺地)將顯示代碼放入(A)touchesBegan:withEvent和(Z)touchesEnded:withEvent:中。感覺怪異,但它按預期工作,或者起初看起來如此。

執行addTarget:action:forControlEvents後用於將UIControlEventTouchUpInside綁定到方法(X)itemTapped:,我希望這些方法總是以(A)(X)(Z)的順序觸發。但是,如果您真正快速點擊屏幕(或模擬器中的鼠標),它們將按照(A)(Z)(X)的順序點亮。 (A)和(Z)在如此快速連續的情況下彼此追隨,整個視覺反饋用於竊聽是不可見的。這是不想要的行爲。這也不是要走的路,因爲許多應用程序需要類似的行爲,對吧?

所以我對你的問題是:我做錯了什麼?我猜測的一件事是,按鈕的外觀不應該在touchesBegan:withEventtouchesEnded:withEvent中操作,但是在哪裏?或者我錯過了其他一些衆所周知的事實?

感謝您的推動, 埃裏克保羅。

+0

只是好奇,如果我快速觸摸3次,是命令AZXAZXAZX或別的什麼? – TahoeWolverine 2011-01-31 19:57:19

+0

AZX AZX AZX,非常好的重現性。在觸發目標動作之前發生了修改,儘管我認爲目標動作是由[super touchesEnded:withEvent]觸發的。 – epologee 2011-01-31 20:17:47

回答

4

我不知道爲什麼順序是不同的,但這裏有兩個建議來幫助處理它。

你對按鈕做了什麼樣的視覺變化?如果是更改標題/圖像/背景圖像,則可以通過修改按鈕的突出顯示狀態來執行所有操作。您可以設置一些屬性,如每個狀態的標題和背景圖像。當用戶的手指向下按鈕時,highlighted狀態打開,所以此時對此狀態所做的任何更改都將可見。請注意,如果您正在使用按鈕上的selected狀態,那麼您還需要設置UIControlStateHighlighted|UIControlStateSelected的可視外觀,否則當選中的兩個突出顯示&都處於打開狀態時,它將默認恢復爲繼承。

另一個建議是溝touchesBegan:withEvent:touchesEnded:withEvent:並切換到使用繼承自UIControl的方法,即beginTrackingWithTouch:withEvent:endTrackingWithTouch:withEvent:。如果觸摸離開控件,您可能還需要實現continueTrackingWithTouch:withEvent:並使用touchInside屬性關閉視覺調整。

相關問題