0

そのため、UIView の開始位置を保存して、作成したブロックが正しい位置に配置されていない場合にその位置にスナップバックできるようにしようとしています。「startPoint」という CGPoint を作成しました。その座標をブロックの開始点に設定したいと思います。ブロックを取得すると、ブロックを離すと、画面上の 0,0 座標 (左上) に移動します。何が欠けているのか正確にはわかりません。任意の助けをいただければ幸いです。以下は、gestureRecognizer のコードです。

- (void)pan:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *view = [gestureRecognizer view];
    CGPoint startPoint;


    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        view.backgroundColor = [UIColor redColor];
        startPoint = [gestureRecognizer translationInView:self.view];
    }

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

        CGPoint translation = [gestureRecognizer translationInView:view.superview];

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

        [gestureRecognizer setTranslation:CGPointZero inView:view.superview];

    } else if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {

//        double snapX = round(view.center.x / 110) * 110;
//        double snapY = round(view.center.y / 110) * 110;

        double snapX = round(startPoint.x);
        double snapY = round(startPoint.y);

        view.backgroundColor = [UIColor blueColor];

        [UIView animateWithDuration:0.3 animations:^{
            view.center = CGPointMake(snapX, snapY);
        }];
    }
}
4

2 に答える 2

1

。という名前のローカル変数がありますstartPoint。つまり、( )が呼び出されるpan:たびに変数が再作成されます。インスタンス変数またはプロパティを作成して、一度作成され、への呼び出し全体で持続するpan:ようにする必要があります。startPointpan:

于 2011-11-24T05:50:48.090 に答える
0

この行を変更してみてください:

startPoint = [gestureRecognizer translationInView:self.view];

これに:

startPoint = [gestureRecognizer translationInView:view.superview];

また、あなたの説明から何が起こっているのか本当に理解できるかどうかはわかりませんがstartPoint、このメソッドの範囲外で宣言する必要があるようです。

于 2011-11-24T03:24:51.000 に答える