2010-06-01 105 views
0

在iPhone SDK中有touchesBegan,touchesEnded和touchesMoved函數,當觸摸事件出現時被調用。我的問題是,當我將手指放在屏幕上而沒有移動屏幕時,無法知道屏幕上是否有手指。有沒有辦法獲得當前的觸摸屏狀態?iPhone觸摸屏事件

任何touchesBegan,touchesEnded和touchesMoved函數我可以使用休閒代碼來了解每個觸摸的狀態,但在他們之外,我不能:|

NSSet *allTouches = [event allTouches]; 
for(GLuint index = 0; index < [allTouches count]; ++index) 
{ 
    UITouch *touch = [[allTouches allObjects] objectAtIndex:index]; 
    if([touch phase] != UITouchPhaseCancelled) 
    { 
     CGPoint touchPoint = [touch locationInView:self]; 
     //do something with touchPoint that has state [touch phase] 
    } 
} 

回答

0

如果你不想修復你的破碎設計,爲什麼不保留一個活動的觸摸列表解決你的問題?

NSMutableSet * touches;

在你的touchesBegan添加它們,在touchesEnded和touchesCancelled您刪除它們......

您可以使用一個「全局」對象(即單)來追蹤那些和同步數據訪問。我看不出如何查詢此集合與直接詢問UIKit獲取此信息有什麼不同。

如果您需要觸及標準UIKit對象(例如UIButton)的信息,您可能需要對這些對象進行子類化 - 而且我不確定是否可以獲得所有類的預期效果(因爲它們或它們的子視圖可以以任何他們想要的方式處理接觸)。

1

您應該保留當前觸摸的所有點的列表。確保你的不要只保留UIEventUITouch對象(它們不能保證長壽) - 而是創建你自己的數據數據結構。所有你需要的賠率都是跟蹤觸點當前下跌的點數。

+0

如果我跟蹤所有觸摸,將會出現另一個問題 1)最後一次觸摸後無法更新軌跡類狀態,並且它將保持在「觸摸釋放」的無效狀態 2)如果您解決1)通過更新計時器上的軌道類狀態,您可能會在使用它們之前刪除「釋放」事件並且沒有響應的應用程序。 – Felics 2010-06-01 16:53:33

+0

@Felics,我想你誤解了我的建議。不要讓列表試圖模仿發佈事件 - 仍然可以正常處理觸摸發佈的事件(向某個對象發送消息等)。區別在於您維護一個觸摸位置列表,您可以隨時查詢。 – 2010-06-01 17:02:08

+0

我希望能夠從我的對象中查詢它們的狀態,而不是將事件發送給對象(從一開始就是一個糟糕的體系結構,但現在無法更改,它在數百個源文件中使用:|)。如果我不更新定時器上的跟蹤類,我的問題是如果我不更新定時器的跟蹤類,因爲它將是無效的,或者如果我通過刪除所有發佈事件來更新定時器上的跟蹤類,則不處理所有事件...我知道這個問題將通過發送事件而不是查詢狀態來解決,但現在它不能像這樣解決。 – Felics 2010-06-01 17:12:10