2012-02-16 103 views
1

我有一個UIView實例,我正在使用CAKeyframeAnimation進行動畫處理。這是一個循環動畫,並將不斷運動。但是,我需要允許用戶與物品進行互動(確切地說,響應點擊)。由於CoreAnimation僅移動表示層而不移動模型,因此我無法使用UIButton實例來獲取touchUpInside事件。處理動畫UIView/CALayer觸摸的最佳模式?

考慮以下基本示例佈局:

enter image description here

我使用了觸摸事件的藍色框通過重寫touchesEnded:withEvent:方法上UIView子類。然後,我通過NSNotification(我真的不想引入很多耦合來處理此事件)將該事件冒泡給包含的視圖控制器,然後在紅色框中執行hitTest:動畫。

所有這一切似乎都相當冒險,只能觸摸動畫UIView處理動畫UIView/CALayer實例觸摸的最佳模式是什麼?

+0

您是否需要使用CA? CA對於流暢的動畫來說是最好的選擇,因爲它非常輕便,而且輕量級,因爲它沒有全部的事件處理功能(部分屬實)。如果你以某種方式向它添加事件處理,那麼你可能會破壞平滑的GPU能力。我不確定有沒有辦法解決這個問題。它需要多麼流暢?你可能想用其他一些動畫技術來動畫,這些動畫技術實際上是用CPU來移動模型的。只是想和你大聲說話。 – Vinnie 2012-02-16 05:09:54

+0

@Vinnie - 問題是這個例子是一個非常簡單的動畫。真正的問題實際上涉及若干關鍵幀,以便沿着路徑對視圖進行動畫處理,並在沿路徑移動時進行一些旋轉。動畫也需要重複ad-infinitum,所以使用基於UIView塊實際上看起來不太合適。 – 2012-02-16 05:30:58

回答

1

追蹤superview中的觸摸是正確的,我相信。但是我會在超視圖中進行測試,而不是向視圖控制器發佈通知。類似這樣的:

創建一個MYAnimationContainerView類(藍色框)。

給它一個擁有視圖控制器設置的委託或阻止回調。例如:

__weak id weakSelf = self; 
MYAnimationContainerView *view = [[MYAnimationContainerView alloc] initWithTouchCallback:^(UIView *touchedView){ 
    [weakSelf handleTouchToView:touchedView]; 
}]; 

MYAnimationContainerView,同時覆蓋touchesBegan:withEvent:touchesEnded:withEvent:。在began中,對移動視圖的表示層執行命中測試。跟蹤哪一個(如果有)被觸摸。在ended中,執行另一次命中測試。如果它是相同的看法,然後打電話給你的回調。

上述可以很容易地用delegate協議而不是一個塊來實現。我剛剛養成了比單方法委託協議更喜歡塊的習慣。

你也可以使用目標/選擇器來實現它,但是該模式已經變成a bit of a hassle with ARC,我傾向於阻止它在今天的使用。

+0

我更喜歡你的方法。謝謝! – 2012-02-17 02:17:46

0

如果您想要處理視圖中特定對象的觸摸,請說出藍色的紅色框,最好創建一個單獨的類,比如UIview的子類,並處理其中的觸摸事件。它乾淨而抽象。

如果有很多這樣的對象,觸摸事件是由它自己處理的。

我不確定這是您的預期。

+0

觸摸不是由它們自己處理的,這是因爲只有表示層是動畫的,而不是模型層,觸摸處理。 – 2012-02-16 13:35:47