簡體   English   中英

獲取當前的觸摸觸摸

[英]Get current touch in touchesMoved

我想在touchesMoved觸摸當前對象。 請勿將其與touchLocation(CGPoint)混淆,而應與用戶正在觸摸的實際對象混淆。 使用UITouch總是返回初始觸摸(如蘋果文檔中所述),而不是當前或最新觸摸。

我有一個網格點( UIImageViews ),可以是3 x 3到20 x 20。

當用戶在屏幕上拖動手指時,將繪制一條跟蹤用戶手指的線。 當用戶與網格點相交時,直線的起點將捕捉到該點並繼續跟蹤手指,從本質上講,您可以在網格上繪制形狀。

目前,我有一個for循環,用於檢查touchlocation是否與網格點相交。 這確實可以工作,但是由於明顯的原因,當它們為400格點時非常慢。

我也嘗試過手勢識別器,但是這些取消了觸摸。

任何幫助/建議將不勝感激,謝謝!

編輯:這就是我的感動。

UITouch* touch = [touches anyObject];
CGPoint touchLocation =[touch locationInView:self];

for (int i=100; i<tagInt; i++) {

    UIImageView *img=(UIImageView*)[self.view viewWithTag:i];

    if (CGRectContainsPoint(img.frame, touchLocation)) {
       //Drawing code  setNeedsDisplay etc
    }
 }

如對最初問題的評論中所述,從容器視圖中找到觸摸位置似乎是最好的。 此代碼中最大的瓶頸是將所有對象存儲在一個線性數組中,然后檢查數組中的每個元素。 更好的方法是以更好的格式存儲對象,您可以在其中根據對象的位置訪問它們。

如果將對象排列在嚴格的網格上,則將它們存儲在二維數組中應該足夠快。 將屏幕細分為網格划分,然后在這些網格划分中找到touchesMoved點。 使用這兩個整數作為2D數組的索引,並檢查數組中該位置可用的一個對象。 如果在網格上的每個位置都沒有對象,則只需在該位置存儲一個零即可告訴您的代碼“無需在此處檢查”。 如果在每個網格位置可能有多個對象,則可以在陣列中該位置保留一個對象列表,並檢查列表中的所有對象。 這將比總數少得多(如果您的對象沒有聚集)。

即使您的對象未布置在嚴格的網格上,也可以使用此技術。 僅將屏幕分成四個象限,就可以將檢查對象所需的時間大致減少到初始時間的四分之一。

如果您的對象在移動,則必須保持此數組的更新。

基於您問題中的有限信息,這個2D陣列只是我對更好的實現方法的第一個想法。 這可能不是在實際程序中工作的最佳方法,並且不同的數據結構和算法可能更適合。

應該把繪圖代碼在觸摸時的處理方式。 也許最好的方法是將所有接觸點保存在臨時可變數組中。 drawRect方法中,每幀繪制一條正確的線。 擺脫觸摸處理方法的邏輯。 (也可以在后台進行位置固定計算,完成后將更新該行。)

我仍然不太明白你要畫什么。 能給我們一個例子嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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