2013-07-02 80 views
7

有人可以解釋這兩種方法之間的高級差異嗎?特別是,你們什麼時候使用一種,而且這些方法的目的有沒有重疊? 他們似乎是爲了相同的目的,但在文檔中似乎沒有任何關係,這讓我感到困惑。beginTrackingWithTouch和touchesBegan有何區別?

回答

7

beginTrackingWithTouch:withEvent:方法

1)子類UIControl

2)發送至當與所述給定事件的觸​​摸進入控制的邊界的控制。

3)提供自定義的跟蹤行爲(例如,更改高亮顯示)。 要做到這一點,使用一個或全部下列方法:beginTrackingWithTouch:withEvent:,continueTrackingWithTouch:withEvent:,endTrackingWithTouch:withEvent:方法


的touchesBegan:withEvent:方法

1)子類UIResponder

2)當一個或多個手指在視圖或窗口中觸碰時告訴接收器。

3)有兩種常見類型的事件:觸摸事件和動作事件。 觸摸的主要事件處理方法是touchesBegan:withEvent :, touchesMoved:withEvent :, touchesEnded:withEvent :, touchesCancelled:withEvent :. 這些方法的參數將觸摸與它們的事件相關聯 - 特別是新的或已更改的觸摸 - 並因此允許響應器對象跟蹤和處理觸摸,因爲交付的事件通過多點觸摸序列的階段進行。每當手指觸摸屏幕,在屏幕上拖動或從屏幕上擡起時,都會生成一個UIEvent對象。事件對象包含用於屏幕上所有手指的UITouch對象或僅從其上取下。

+0

好答案謝謝。 – petric

+2

謝謝。把它放到上下文中:我有一個包含一堆子視圖(例如標籤)的自定義控件。用戶應該能夠拖動這些標籤,並且它們以主控制(容器)控制的方式與彼此(在運動期間)交互。我應該使用哪種觸摸方法來實現拖動:由UIControl提供的那些,還是由UIResponder提供的? – rmp251

3

今天剛剛遇到這個問題,我認爲最主要的區別是beginTrackingWithTouch和朋友只用於跟蹤 - 而不是其他任何事情 - 特別是不用於目標/動作處理。所以如果你重寫touchesBegan,那麼當觸摸結束時,你也要負責調用sendActionsForControlEvents。但是,如果你使用beginTrackingWithTouch,那是免費的。

我發現這通過實現beginTrackingWithTouch(用於自定義按鈕控件),認爲它只是處理touchesBegan的橫向替換。所以在endTrackingWithTouch中,如果touchInside爲true,我會調用sendActionsForControlEvents。最終的結果是這個動作被調用了兩次,因爲首先內建機制發出了動作,然後我調用它。就我而言,我只是在自定義突出顯示方面很有趣,所以拿掉了對sendActionsForControlEvents的調用,並且都很好。

摘要:當您需要自定義跟蹤時,使用beginTrackingWithTouch,並在需要自定義目標/操作處理(或其他低級細節)時使用touchesBegan。