9

UITableViewControllerにUIPanGestureRecognizerを実装して、スワイプしてアニメーションを削除するために使用しようとしています。Clearアプリで使用される削除するスワイプと同様に、UITableViewCellを左または右にスワイプすると、セルが移動して削除されます。

UITableViewCellサブクラスにこれを実装しようとしましたが、イベントを受信して​​いないようです。

これは、この機能を試すためにUITableViewCellサブクラスに配置したコードです。私のinitメソッドでは

UIGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    recognizer.delegate = self;
    [self addGestureRecognizer:recognizer];

そしてそれを処理する方法:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
CGPoint translation = [gestureRecognizer translationInView:self.superview];
//might have to change view to tableView
//check for the horizontal gesture
if (fabsf(translation.x) > fabsf(translation.y)) {
    return YES;
    NSLog(@"Panning");
}
return NO;
}

- (void)handlePan:(UIPanGestureRecognizer *)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
    //if the gesture has just started record the center location
    NSLog(@"handlePan");
    _originalCenter = self.center; //Declared as a CGPoint at the top of my TableViewCell
}

if (recognizer.state == UIGestureRecognizerStateChanged) {
    //translate the center (aka translate from the center of the cell)
    CGPoint translation = [recognizer translationInView:self];
    self.center = CGPointMake(_originalCenter.x + translation.x, _originalCenter.y);
    // determine whether the item has been dragged far enough to delete/complete

}

if (recognizer.state == UIGestureRecognizerStateEnded) {
    // the frame this cell would have had before being dragged
    CGRect originalFrame = CGRectMake(0, self.frame.origin.y, self.bounds.origin.x, self.bounds.size.height);
    [UIView animateWithDuration:0.2 animations:^{
        self.frame = originalFrame;}
     ];
}
}

ただし、セルはまったく移動しません。ここで何が起こっているのかよくわかりません

4

3 に答える 3

20

セルのスワイプジェスチャをテーブルビューのスクロールジェスチャと同時に実行したくない場合は、セルにパンジェスチャを追加して、セルをデリゲートにします。

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(doPan:)];
pan.delegate = self;
[self addGestureRecognizer:pan];

そして、次のデリゲートメソッドを実装して、パンが水平の場合にのみ開始します。

#pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // note: we might be called from an internal UITableViewCell long press gesture

    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {

        UIPanGestureRecognizer *panGestureRecognizer = (UIPanGestureRecognizer*)gestureRecognizer;
        UIView *cell = [panGestureRecognizer view];
        CGPoint translation = [panGestureRecognizer translationInView:[cell superview]];

        // Check for horizontal gesture
        if (fabs(translation.x) > fabs(translation.y))
        {
            return YES;
        }

    }

    return NO;
}

Swift3.。

override func awakeFromNib() {
    super.awakeFromNib()
    // do not use, say, layoutSubviews as layoutSubviews is called often
    let p = UIPanGestureRecognizer(target: self, action: #selector(yourPan))
    p.delegate = self
    contentView.addGestureRecognizer(p)
    }
}

override func gestureRecognizerShouldBegin(_ g: UIGestureRecognizer) -> Bool {
    if (g.isKind(of: UIPanGestureRecognizer.self)) {
        let t = (g as! UIPanGestureRecognizer).translation(in: contentView)
        let verticalness = abs(t.y)
        if (verticalness > 0) {
            print("ignore vertical motion in the pan ...")
            print("the event engine will >pass on the gesture< to the scroll view")
            return false
        }
    }
    return true
}
于 2016-09-14T15:48:11.893 に答える
13

scrollViewのpanGestureと同期してジェスチャを検出するには、次のメソッドが必要です。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
   return YES; //otherGestureRecognizer is your custom pan gesture
}

panGesture.delegateをviewControllerに設定することを忘れないでください。(OlivaresFのコメントで更新されました。)

于 2013-05-11T23:03:28.423 に答える
0

ジェスチャレコグナイザーをコンテンツビューに追加します。

[self.contentView addGestureRecognizer:recognizer];
于 2013-03-12T21:24:21.600 に答える