6

メインのUIViewにサブビュー(と呼ばれるpanel)を追加し、それにgestureRecognizerを追加しました。これは、Y軸に対してのみ、特定の制限(つまり、160、300、300を超えると移動できない)に対してのみドラッグ可能にするためです。

そのようにジェスチャー処理を実装しました

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:self.view]; 
    recognizer.view.center = CGPointMake(self.view.frame.size.width/2, recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view.superview];

    //now limit the drag to some coordinates
   if (y == 300 || y == 190){
       no more drag
    }
}

しかし今、ドラッグをそれらの座標に制限する方法がわかりません。

大きなビューではなく、ツールバーとボタンを含む小さなビューです。

ドラッグを座標に制限するにはどうすればよいですか?(x = 160(中央画面)、y = 404)<-例

センターはどこにあるべきですか?

たくさんググったのですが、具体的な答えが見つかりませんでした。

前もって感謝します

4

4 に答える 4

22

まず、ビューの中心を変更する前に、制限を適用する必要があります。コードは、新しい中心が範囲外かどうかを確認する前に、ビューの中心を変更します。

次に、Y座標をテストするために正しいC演算子を使用する必要があります。=演算子は割り当てです。オペレーターは==同等性をテストしますが、それも使用したくありません。

第3に、新しいセンターが範囲外の場合は、レコグナイザーの変換をリセットしたくないでしょう。ドラッグが範囲外になったときに変換をリセットすると、ユーザーの指がドラッグしているビューから切断されます。

あなたはおそらくこのようなものが欲しいでしょう:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:self.view];

    // Figure out where the user is trying to drag the view.
    CGPoint newCenter = CGPointMake(self.view.bounds.size.width / 2,
        recognizer.view.center.y + translation.y);

    // See if the new position is in bounds.
    if (newCenter.y >= 160 && newCenter.y <= 300) {
        recognizer.view.center = newCenter;
        [recognizer setTranslation:CGPointZero inView:self.view];
    }
}
于 2012-07-11T20:36:39.470 に答える
14

ロブの答えにはおそらく意図しない結果があります。十分に速くドラッグすると、newCenterは範囲外になりますが、それは最後の更新の前に発生する可能性があります。その結果、ビューが最後までパンされなくなります。newCenterが範囲外の場合は更新しないのではなく、常に中心を更新する必要がありますが、次のように範囲を制限します。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:self.view];

    // Figure out where the user is trying to drag the view.
    CGPoint newCenter = CGPointMake(self.view.bounds.size.width / 2,
    recognizer.view.center.y + translation.y);

    // limit the bounds but always update the center
    newCenter.y = MAX(160, newCenter.y);
    newCenter.y = MIN(300, newCenter.y);

    recognizer.view.center = newCenter;
    [recognizer setTranslation:CGPointZero inView:self.view];
}
于 2015-01-08T22:32:40.963 に答える
1

上記の両方の答えはY座標に対して正しいです。これは、X座標とY座標の両方を探している人のためのものです。小さな変更を加えただけです。

- (void)panWasRecognized:(UIPanGestureRecognizer *)panner {
    UIView *piece = [panner view];
    CGPoint translation = [panner translationInView:[piece superview]];

    CGPoint newCenter = CGPointMake(panner.view.center.x + translation.x,
                                    panner.view.center.y + translation.y);
    if (newCenter.y >= 0 && newCenter.y <= 300 && newCenter.x >= 0 && newCenter.x <=300) 
    {
        panner.view.center = newCenter;
        [panner setTranslation:CGPointZero inView:[piece superview]];
    }
}
于 2017-07-20T08:47:10.927 に答える
0
-(void)handlePan:(UIPanGestureRecognizer*)pgr;
{
    if (pgr.state == UIGestureRecognizerStateChanged) {
        CGPoint center = pgr.view.center;
        CGPoint translation = [pgr translationInView:pgr.view];
        center = CGPointMake(center.x + translation.x,
                             center.y + translation.y);

        if ([self pointInside:center withEvent:nil])
        {
            pgr.view.center = center;
            [pgr setTranslation:CGPointZero inView:pgr.view];
        }
    }
}
于 2019-08-22T00:21:51.410 に答える