2012-03-12 16 views
1

私はUITableViewCellsにシングルタップジェスチャ認識器とダブルタップジェスチャ認識器を追加しました。しかし、テーブルを数回スクロールすると、テーブルをスクロールするスワイプジェスチャーの終わりと、スクロールアニメーションの開始との間にますます時間がかかります。UITableViewCell GestureReognizerのパフォーマンスに関する問題

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"tableViewCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 

    UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
    singleTap.numberOfTapsRequired = 1; 
    singleTap.numberOfTouchesRequired = 1; 
    [cell addGestureRecognizer:singleTap]; 

    UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; 
    doubleTap.numberOfTapsRequired = 2; 
    doubleTap.numberOfTouchesRequired = 1; 
    [singleTap requireGestureRecognizerToFail:doubleTap]; 
    [cell addGestureRecognizer:doubleTap]; 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     // search results 
    } 
    else { 
     // normal table 
    } 

    return cell; 
} 

SingleTap:とダブルタップ:初期スクロールが滑らかであるので、方法

- (void)singleTap:(UITapGestureRecognizer *)tap 
{ 
    if (UIGestureRecognizerStateEnded == tap.state) { 
     UITableViewCell *cell = (UITableViewCell *)tap.view; 
     UITableView *tableView = (UITableView *)cell.superview; 
     NSIndexPath* indexPath = [tableView indexPathForCell:cell]; 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     // do single tap 
    } 
} 

- (void)doubleTap:(UITapGestureRecognizer *)tap 
{ 
    if (UIGestureRecognizerStateEnded == tap.state) { 
     UITableViewCell *cell = (UITableViewCell *)tap.view; 
     UITableView *tableView = (UITableView *)cell.superview; 
     NSIndexPath* indexPath = [tableView indexPathForCell:cell]; 
     [tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     // do double tap 
    } 
} 

私はif (cell == nil)状態にジェスチャーrecognisersを追加しようとしたが、それらは細胞に添加したことがないどこ。

また、個別のセルではなく、tableViewにジェスチャを追加しましたが、これはsearchDisplayControllerの問題、つまりキャンセルボタンのタップが認識されない原因となりました。

私はどんな考えにも感謝します。

答えて

6

同じNSIndexPathに対してcellForRowAtIndexPathメソッドが複数回呼び出されるため、セルにジェスチャ認識ツールをあまりにも多く追加します。したがって、パフォーマンスが低下します。

私の最初の提案は、表ビューにジェスチャ認識器を1つだけ追加することです。 (私は同様の質問のためにこの回答を書いた:https://stackoverflow.com/a/4604667/550177

しかし、あなたが言ったように、それはsearchDisplayControllerに問題を引き起こします。おそらく、UIGestureRecognizerDelegateのスマートな実装でそれらを避けることができます(タップがセル内になかった場合は-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;にNOを返します)。

私の第二の提案:一度だけジェスチャー認識機能を追加します。

if ([cell.gestureRecognizers count] == 0) { 
    // add recognizer for single tap + double tap 
} 
+0

おかげで、私はちょうど(セルが== nilの) 'iOS5をし、ストーリーボードを使用して、真のことはありません場合は、'ことを実現し、同じ解決策を考え出しましたあなたの2番目の提案として、それはうまく動作します。しかし、私はあなたの最初のアイデアがもっと好きです、私はそれを試してみましょう。 – steharro

関連する問題