2012-06-14 31 views
1

這是一個針對客戶端的項目,他希望它使用TouchesBegan/Moved/Ended而不是手勢,因爲它必須與iOS 3.0和3.1兼容並且手勢是iOS> = 3.2。iPhone - 在iOS 3.x上檢測單點擊和長時間點擊

我必須檢測一個自定義元素上的單擊和長按,這是一種tableView元素,我們稱之爲單元格。

我必須遵循的規則是:

  • 單抽頭爲0.1秒後到火的方法(可以稱之爲cellTapped)
  • 如果控制被滾動之前,它是時間來執行cellTapped相反,如果檢測到長按,取消cellTapped執行
  • ,運行不cellTapped

這個longTap方法是我在的touchesBegan

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    self.isScrolling = NO; 

    // if single tap detected, fire method within 0.1 seconds 
    if ([self elementIsTapped:touches]) { 
      [self performSelector:@selector(cellTapped:) 
        withObject:nil 
        afterDelay:0.1]; 
    } 

} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 


    if (self.isScrolling == NO) { 
     // started scrolling, cancel single tap method that was about to be executed 
     [NSObject cancelPreviousPerformRequestsWithTarget:self 
               selector:@selector(cellTapped:) 
                object:nil]; 
     self.isScrolling = YES; 
    } 
} 

如何將長時間檢測添加到此邏輯?謝謝

+0

這顯然不是一個有用的答案,但爲什麼你需要支持iOS 3.x? – jonmorgan

+0

實現'touchesEnded'並計算'開始'和'結束'之間的時間差,並將這個時間差用於您的單觸或長觸式情況。 – Legolas

+0

據我所知,這個項目在公司內部使用,他有很多舊設備,運行3.0,他希望這些設備運行應用程序。我知道,我知道,但是感覺到我的痛苦... – SpaceDog

回答

2

我認爲你的邏輯有點倒退。你應該添加一個定時器的長按你的觸摸開始方法,而不是一個水龍頭的計時器。然後,在觸摸結束方法中,如果尚未開啓方法,則可以取消該方法,然後調用tap方法,或者如果它已經觸發,則不執行任何操作。

P.S. iOS 3.0?哎喲...不妨寫上翻蓋手機。

+0

翻蓋手機。哈哈 – Legolas

+0

是的,我知道,但至少這個客戶付款的時間。 – SpaceDog

+0

我認爲你是最簡單的解決方案。謝謝。 – SpaceDog

2

不使用UIGestureRecognizers的長時間檢測實際上非常簡單。你可以按照這樣的模式:

在touchesBeganBegin,設置BOOL標誌hasLongTouchPassed爲假。然後,使用[self performSelector:@selector(longPressDetected) withObject:nil afterDelay:1.0f]。在longPressDetected中設置hasLongTouchPassed標誌爲true。然後,在touchesEnded上,檢測hasLongTouchPassed是否爲真,如果是則是長時間觸摸。如果用戶的時代已經過去了之前提起其手指,叫[NSObject cancelPreviousPerformRequestWithTarget:self]

或者,你可以代替touchesEnded再次存儲日期與[NSDate date]上的touchesBegan,然後和比較,看看時間間隔足夠長的考慮是長時間的。

另外,如果你想要一個觸發事件,關閉的時間X量後,用戶按下

這裏假設你沒有使用多點觸控。如果你是,你將不得不跟蹤哪個手指在哪裏以及持續多久。

+0

對不起,我錯誤地表達了自己。這需要在沒有手勢的情況下完成。 – SpaceDog

+1

好吧,然後用不同的解決方案編輯我的文章。 – CrimsonDiego

+0

我不能使用手勢。它必須與3.0兼容。 – SpaceDog