2

UIViewに接続されているUIPanGestureRecognizerがあります。私がやろうとしているのは、基本的にバケツにドラッグアンドドロップすることです。ユーザーがUIViewを手放し、それがバケットにない場合は、元の開始位置にアニメーションで戻す必要があります。UIPanGestureRecognizerに呼び出されるセレクターは次のとおりです。

- (void)handleDragDescriptionView:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *panViewPiece = [gestureRecognizer view];
    CGRect originalFrame = CGRectMake(946, 20, 58, 30);

    CGPoint translation = [gestureRecognizer translationInView:panViewPiece];
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan || gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        panViewPiece.center = CGPointMake(panViewPiece.center.x + translation.x, panViewPiece.center.y + translation.y);

        [gestureRecognizer setTranslation:CGPointZero inView:panViewPiece.superview];
    }
    else if (gestureRecognizer.state == UIGestureRecognizerStateCancelled) {
        [UIView animateWithDuration:0.25 animations:^{
            self.dragDescriptionView.frame = originalFrame;
        }];
    }
    else {
        [UIView animateWithDuration:0.25 animations:^{
            self.dragDescriptionView.frame = originalFrame;
        }];
    }

}

originalFrameメソッドの先頭にないでこれを実行できるかどうか疑問に思いました。私はもともと持っていた

CGRect originalFrame = _dragDescriptionView.frame; 

ハードコーディングの代わりに、しかしそれはスナップバックしません。ドラッグしながらその値を更新しているためか。値のハードコーディングは特に好きではありませんが、これを回避する方法があるかどうかはわかりませんでした。ありがとう!

4

1 に答える 1

5

実際には、ビューの元の中心を追跡するだけで済みます。インスタンスoriginalCenter変数を作成し、ジェスチャーの開始時にのみ設定します。

@implementation MyViewController {
    CGPoint _originalCenter;
}

- (void)handleDragDescriptionView:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *panViewPiece = [gestureRecognizer view];

    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:
            _originalCenter = panViewPiece.center;
            break;

        case UIGestureRecognizerStateChanged: {
            CGPoint translation = [gestureRecognizer translationInView:panViewPiece.superview];
            panViewPiece.center = CGPointMake(panViewPiece.center.x + translation.x, panViewPiece.center.y + translation.y);
            [gestureRecognizer setTranslation:CGPointZero inView:panViewPiece.superview];
            break;
        }

        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled: {
            [UIView animateWithDuration:0.25 animations:^{
                panViewPiece.center = _originalCenter;
            }];
            break;
        }

        default:
            break;
    }
}
于 2012-11-12T23:39:09.657 に答える