1. ホーム
  2. iphone

[解決済み] UIPanGestureRecognizerを使ってオブジェクトを移動させるには? iPhone/iPad

2023-07-09 16:40:34

質問

の例がいくつかあります。 UIPanGestureRecognizer クラスがあります。例えば、私が読んだことのある この を読みましたが、まだ使えません。

私が作業しているnibファイルには UIView (画像上の白い四角形) があり、このクラスでドラッグしたいのです。

で、.m ファイルに配置しました。

- (void)setTranslation:(CGPoint)translation inView:(UIView *)view
{
    NSLog(@"Test to see if this method gets executed");
}

でマウスをドラッグしても、そのメソッドは実行されません。 UIView . 配置も試してみました。

- (void)pan:(UIPanGestureRecognizer *)gesture
{
    NSLog(@"testing");
}

そして、このメソッドも実行されません。もしかしたら私が間違っているかもしれませんが、このメソッドは - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event メソッドのように、タッチがあるたびにそのメソッドが呼び出されるようにする必要があります。

私は何を間違えているのでしょうか?多分、私はそのメソッドへの接続を描画する必要がありますか?もしそうなら、どのようにそれを行うことができますか?

どのように解決するには?

私はチュートリアルを見つけました UIGestureRecognizersの使用方法 を見つけ、そしてそれは私が探しているものだと思います。 それは私が次のソリューションを考え出すのに役立ちました。

-(IBAction) someMethod {
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    [panRecognizer setMinimumNumberOfTouches:1];
    [panRecognizer setMaximumNumberOfTouches:1];
    [ViewMain addGestureRecognizer:panRecognizer];
    [panRecognizer release];
}

-(void)move:(UIPanGestureRecognizer*)sender {
    [self.view bringSubviewToFront:sender.view];
    CGPoint translatedPoint = [sender translationInView:sender.view.superview];

    if (sender.state == UIGestureRecognizerStateBegan) {
        firstX = sender.view.center.x;
        firstY = sender.view.center.y;
    }


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

    [sender.view setCenter:translatedPoint];
    [sender setTranslation:CGPointZero inView:sender.view];

    if (sender.state == UIGestureRecognizerStateEnded) {
        CGFloat velocityX = (0.2*[sender velocityInView:self.view].x);
        CGFloat velocityY = (0.2*[sender velocityInView:self.view].y);

        CGFloat finalX = translatedPoint.x + velocityX;
        CGFloat finalY = translatedPoint.y + velocityY;// translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y);

        if (finalX < 0) {
            finalX = 0;
        } else if (finalX > self.view.frame.size.width) {
            finalX = self.view.frame.size.width;
        }

        if (finalY < 50) { // to avoid status bar
            finalY = 50;
        } else if (finalY > self.view.frame.size.height) {
            finalY = self.view.frame.size.height;
        }

        CGFloat animationDuration = (ABS(velocityX)*.0002)+.2;

        NSLog(@"the duration is: %f", animationDuration);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:animationDuration];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(animationDidFinish)];
        [[sender view] setCenter:CGPointMake(finalX, finalY)];
        [UIView commitAnimations];
    }
}