2013-06-12 137 views
0

我正在構建一個平鋪應用程序,可以拖動和滑動。目前,我已將整個圖塊作爲子視圖添加。我很好奇,拖動tile元素的更好的方法是什麼,如果放置在另一個元素的頂部,元素swap的位置座標。iOS中的觸摸事件

Swaps when placent A to B 
View A <- -> View B 

To 

View B <- -> View A 

我已經看過觸摸事件,但隨後它基於任何視圖。另外我也研究過UIGestureRecognizer,但是我想知道是否有任何可以處理這個問題的好的框架,或者有什麼比這更好的方法。

回答

0

通過在超級視圖上覆蓋觸摸事件,您可以非常輕鬆地創建此係統。觸摸開始找出什麼子視圖被擊中,接觸移動它的中心觸摸位置和觸摸結束再次檢查它被放在哪個視圖和交換這兩個視圖。

UIView有很多方便的方法可以幫到你:pointInside,convertPoint,convertRect。您可能只需要pointInside用於您的目的。

所以在這種情況下,你應該設置userInteractionEnabledNO瓷磚和處理觸摸他們的超級視角。要進行命中檢查,只需使用for循環和pointInside,但在觸摸結束時,您應該跳過對當前正在拖動的視圖的檢查。

編輯: UIPanGestureRecognizer評論

UIPanGestureRecognizer可能實際工作,雖然你受益很少的吧。你將能夠獲得它即時平移的觀點,但這是關於它的。您仍然需要通過類似for循環的方式找到它已完成的視圖。手勢的位置將需要轉換爲超視圖座標(如果沒有,您將始終收到相同的座標,因爲您移動視圖本身)。缺點是你不會立即得到平移的事件,你將不得不開始拖動視圖幾個像素來接收平移開始,另一方面,你可能想立即將視圖放在前面或做一些事情其他動畫來通知用戶該視圖是可移動的。

無論如何,UIPanGestureRecognizer是爲了平移而設計的。雖然它可能會用於您的目的,但您可能會發現自己在做更多的工作,那麼只需簡單的觸摸事件即可。

+0

馬蒂奇的解釋是好了很多,這是非常好的信息 – aug2uag

+0

由於馬蒂奇和aug2uag您建議,但是您認爲UIGestureRecognizerPan可能會更有益,因爲它將以不同方式用於每個視圖?謝謝。 – kforkarim

+0

我編輯了你的評論的答案... –

0

[touches anyObject]消息可能是一個不錯的選擇

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self methodToChangeView]; 
} 

以下方法

- (void)methodToChangeView { 
    MyNewViewController *myNewViewController = [[MyNewViewController alloc] initWithNibName:@"MyNewViewController" bundle:nil]; 
    [self.navigationController pushViewController:myNewViewController animated:YES]; 
}