0

現在、UIPanGestureRecognizerを使用して左右にスライドするUITableviewCellのサブクラスを使用するiPadアプリを開発していますが、右にスライドするだけで、左にスライドするだけです...これは私が使用しているコードです。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString           *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) 
    {
    // Initialization code
                  UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self        action:@selector(handlePan:)];
    pan.delegate = self;

    [self addGestureRecognizer:pan];

}
return self;
}

これは私のhandlePan:メソッドです。

 CGPoint translation = [gesture locationInView:self];
    self.center = CGPointMake(self.center.x + translation.x,
                              self.center.y);
    if (self.center.x > 700) {
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:self.tag],@"number",nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"right" object:nil userInfo:dic];
        dic = nil;
    }
    if (self.center.x < 0){
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:self.tag],@"number",nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"left" object:nil userInfo:dic];
        dic = nil;
        NSLog(@"Left Called");


    }
    [gesture setTranslation:CGPointZero inView:self];

何を試しても、コンソールに「Left Called」と表示されないようです。つまり、セルが左にスライドします。私はこの問題に本当に苦労しており、助けていただければ幸いです。

4

2 に答える 2

2

秘訣は、鍋の変化した状態に反応することであり、中心の計算ははるかに簡単になります...

- (void)handlePan:(UIPanGestureRecognizer *)gesture {

    if ((gesture.state == UIGestureRecognizerStateChanged) ||
        (gesture.state == UIGestureRecognizerStateEnded)) {

        CGPoint newCenter = CGPointMake([gesture locationInView:self.superview].x, self.center.y);
        self.center = newCenter;

        // To determine the direction of the pan, check the sign of translation in view.
        // This supplies the cumulative translation...
        if ([gesture translationInView:self.superview].x > 0) {
            NSLog(@">>>");
        } else {
            NSLog(@"<<<");
        }
    }
}
于 2013-03-03T06:36:55.490 に答える
1

左/右を決定する方法に欠陥がある可能性があると思います。

CGPoint translation = [gesture locationInView:self];
self.center = CGPointMake(self.center.x + translation.x,
                              self.center.y);

「移動」はビュー内の正の位置であるため、self.center.x は常に正になります。おそらく元のタッチ位置を追跡し、スワイプ/移動時の位置と比較したいもの。次のようなことを試してください:

- (void)handlePan:(UIPanGestureRecognizer *)panRecognizer {

    if (panRecognizer.state == UIGestureRecognizerStateBegan)
    {
        // create a local property for the original point and assign the position on first touch
        self.originalPanTouchPoint = [panRecognizer locationInView:self.view];
        // create a local property for cell's center prior to pan
        self.initialCellCenter = self.center;
    } else {
        CGPoint currentTouchPoint = [panRecognizer locationInView:self.view];
        CGFloat xTranslation = self.originalPanTouchPoint.x - currentTouchPoint.x;

        self.center = CGPointMake(self.initialCellCenter.x + xTranslation, self.initialCellCenter.y);
    }
}
于 2013-03-03T03:26:10.523 に答える