2

UITableViewCellサブクラスがありUIView、そのcontentViewプロパティに a を追加しました。そのサブビューをドラッグできるようにするために、UIResponder適切なメソッドを実装しました。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  UITouch *touch = [touches anyObject];
  CGPoint currentLocation = [touch locationInView:self.superview];
  if (currentLocation.x >= self.rootFrame.origin.x) {
    return;
  }

  CGRect frame = self.frame;
  frame.origin.x = currentLocation.x;
  self.frame = frame;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  self.frame = self.rootFrame; // rootFrame is a copy of the initial frame
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
 [self touchesEnded:touches withEvent:event];
}

サブビューは問題なくドラッグできますが、セルも選択されているため、それ-tableView:didSelectRowAtIndexPath:が呼び出されています。

サブビューがドラッグされているときにセルが選択されるのを防ぐにはどうすればよいですか?

4

3 に答える 3

0

この状況を解決するために、サブビューのプロトコルを書きました:

@protocol MyViewDelegate <NSObject>

///
/// Tells the delegate that touches has begun in view
///
- (void)view:(UIView *)view didBeginDragging:(UIEvent *)event;

///
/// Tells the delegate that touches has finished in view
///
- (void)view:(UIView *)view didFinishDragging:(UIEvent *)event;

@end

次に、次のUIResponderようにサブビューでメソッドを完成させました。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  [self.delegate view:self didBeginDragging:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  self.frame = self.rootFrame;
  [self.delegate view:self didFinishDragging:event];
}

最後に、セルをビューのデリゲートとして設定し、ドラッグ ジェスチャの進行中にセルの選択を一時的にキャンセルします。

- (void)view:(UIView *)view didBeginDragging:(UIEvent *)event {
  [self setHighlighted:NO animated:NO];
  [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

- (void)vView:(UIView *)view didFinishDragging:(UIEvent *)event {
  [self setSelectionStyle:UITableViewCellSelectionStyleGray];
}

それでおしまい

于 2013-05-03T10:43:46.560 に答える
0

詳細を知らずに正確に判断することは不可能ですが、これを実現する方法はいくつかあります。

  1. UITableViewDelegateプロトコルでの選択をブロックするには、次のようにします。tableView:willSelectRowAtIndexPath:

  2. テーブルを編集モードにして使用できますallowsSelectionDuringEditing

  3. [UITableViewCell setSelected:animated:]またはをオーバーライドすることで、選択/強調表示 UI をブロックできます[UITableViewCell setHighligted:animated:]。ただし、セルは引き続き選択されます。

  4. デフォルトのテーブル選択を無効にして、独自のものを使用できますUITapGestureRecognizer(これは を使用すると非常に簡単[UITableView indexPathForRowAtPoint:]です)。カスタム認識エンジンを使用すると、そのデリゲートを使用して、テーブルがタッチを受け取るタイミングを決定できます。

于 2013-05-02T13:18:19.850 に答える
0
-[UITableViewCell setSelectionStyle: UITableViewCellSelectionStyleNone]

もちろん、tableView:didSelectRowAtIndexPath:引き続き呼び出されるため、コールバックを選択的に無視することをお勧めします。

于 2013-05-02T13:00:18.480 に答える