5

私はtableviewCell、ユーザーがscroll水平にできる場所を持っています。scrollViewは のほぼ全体cellをカバーしているため、ユーザーが をクリックしてもtableViewメソッドは呼び出されません。didSelectRowcell

だから私は、のタッチイベントをに渡すことができると思ったUIScrollViewcell、それでもdidSelectRow呼び出されない。UIScrollViewタッチがドラッグでない場合にのみ、タッチ イベントを渡すようにサブクラス化しました。

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
    NSLog(@"touch scroll");
    // If not dragging, send event to next responder
    if (!self.dragging)
        [self.superview touchesEnded: touches withEvent:event];
    else
        [super touchesEnded: touches withEvent: event];
}

クリックをテーブルに渡し、デリゲートメソッドを呼び出してスクロールを保持する方法についてのアイデアはありますscrollviewか?

4

5 に答える 5

22

サブクラス化せずに実際にこれを行うことができますUIScrollView。カスタム セルがある場合でも、 でプロパティを設定しcellForRowAtIndexPathているUITableView場合でも、次の操作を実行できます。

[cell.contentView addSubview:yourScrollView];
yourScrollView.userInteractionEnabled = NO;
[cell.contentView addGestureRecognizer:yourScrollView.panGestureRecognizer];

これができる理由は、scrollView にはプログラマがアクセスできる独自の panGestureRecognizer があるためです。したがって、セルのビューに追加するだけで、スクロールビューのジェスチャ デリゲートがトリガーされます。

このアプローチの唯一の欠点は、スクロール ビューのサブビューがタッチ入力を受信できないことです。これが必要な場合は、別のアプローチを選択する必要があります。

于 2015-01-08T23:12:34.223 に答える
7

同じ問題が発生しました。
サブクラスには、メソッドの完全なセットを含めるようにしてください。

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesCancelled: touches withEvent:event];
    else
        [super touchesCancelled: touches withEvent: event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesMoved: touches withEvent:event];
    else
        [super touchesMoved: touches withEvent: event];
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesBegan: touches withEvent:event];
    else
        [super touchesBegan: touches withEvent: event];
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if (!self.dragging)
        [self.superview touchesEnded: touches withEvent:event];
    else
        [super touchesEnded: touches withEvent: event];
}
于 2013-03-12T14:59:35.517 に答える
1

選択した回答は正しいですが、取得していたバグに基づいてコードを更新しました。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.dragging) {
        [super touchesMoved:touches withEvent:event];
    } else {
        if ([self.delegate isKindOfClass:[UITableViewCell class]]) {
            [(UITableViewCell *)self.delegate touchesCancelled:touches withEvent:event];
        }

        [self.superview touchesMoved:touches withEvent:event];
    }
}

でない場合self.delegateUITableViewCell、そのプロパティをセルのプロパティに置き換えます。

セルは、望ましくない結果を防ぐために、移動中にキャンセル タッチ イベントを取得する必要があります。以下のように簡単に再現できます。

  • セルを強調表示します (スクロール ビューがセル全体にあると仮定して、スクロール ビューを強調表示しない場合)
  • セルが強調表示されている間に、テーブル ビューをドラッグします。
  • 他のセルを選択すると、以前に強調表示されたセルがdidSelectCell状態を取得します

言及するもう 1 つのポイントは、順序が重要であるということです。self.delegateが の前に呼び出されない場合self.superview、強調表示された状態は発生しません。

于 2014-03-05T06:13:14.710 に答える
-1

これを設定してみてください

_scrollView.canCancelContentTouches = NO

また、タッチイベントを部分的に転送するのは良くありません

于 2013-02-25T09:16:47.857 に答える