1

ユーザーがボタンを離したときにボタンの位置を設定するために、locationInView を使用しています。リリース後、以前に保存した場所を指定しますが、実際にはボタンが正しい位置に戻りません。

この私のコード:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{

    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);

    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

    static CGPoint startLocation;

    if (recognizer.state == UIGestureRecognizerStateBegan) {
        startLocation = [recognizer locationInView:self.view];
        NSLog(@"Began: %d" @"-" @"%d", (int)startLocation.x , (int)startLocation.y);
    }

    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"Ended Bef: %d" @"-" @"%d", (int)startLocation.x, (int)startLocation.y);
        recognizer.view.center =  CGPointMake(startLocation.x, startLocation.y);

        startLocation = [recognizer locationInView:self.view];
        NSLog(@"Ended Aft: %d" @"-" @"%d", (int)startLocation.x, (int)startLocation.y);

    }

 }

実際、命令:

recognizer.view.center =  CGPointMake(startLocation.x, startLocation.y);

間違った効果を与える。誰かが理由を知っていますか?

4

1 に答える 1

3

いくつかの考え:

  1. startLocationの変更を行う前に、必ずキャプチャすることをお勧めしますcenter

  2. にユーザーのタッチの場所を使用していますstartLocation。の でこれを初期化する必要がcenterありrecognizer.viewます。ユーザーがボタンの中央で正確にジェスチャを開始した可能性は非常に低いです。その結果、元の場所に戻ることはほとんどありません。

多少関係ありませんが、次のとおりです。

  1. 句のofをCGMakePointリセットする場合は使用する必要はありません。必要に応じて使用できますが、不要です。必要に応じて、 を使用できます。centerrecognizer.viewUIGestureRecognizerStateEndedCGPointMakestartLocation

  2. ビューがそれに戻ることをアニメーション化することができますstartLocation。すぐにそこに行くのは耳障りです。

  3. 余談ですが、 を保存したstartLocation場合は、継続的に をリセットする必要はありませんtranslationstartLocationplusを使用するだけtranslationです。私にはより明確に思えますが、明らかにそれは主観的です。

  4. 個人的には、構造NSStringFromCGPointをログに記録するときに非常に役立つと思います。CGPoint

だから、私はお勧めします:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer
{
    static CGPoint startLocation;

    if (recognizer.state == UIGestureRecognizerStateBegan)
    {
        startLocation = recognizer.view.center;
        NSLog(@"Began: %@", NSStringFromCGPoint(startLocation));
    }

    CGPoint translation = [recognizer translationInView:self.view];

    recognizer.view.center = CGPointMake(startLocation.x + translation.x,
                                         startLocation.y + translation.y);

    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        NSLog(@"Ended Bef: %@", NSStringFromCGPoint(startLocation));

        [UIView animateWithDuration:0.25
                         animations:^{
                             recognizer.view.center = startLocation;
                         }];

        CGPoint finalLocation = [recognizer locationInView:self.view];
        NSLog(@"Ended Aft: %@", NSStringFromCGPoint(finalLocation));
    }
}
于 2013-04-17T21:54:28.007 に答える