0

1 本の指を使用して UIView をその軸に沿って回転させたいので、UIPanGestureRecognizer を実装しました。uiview 内のボタンがジェスチャを開始し、その時点で UIView が回転します。問題は、ボタンが左上の第 1 象限にある場合にのみ正しく回転することです。他の象限であり、不規則に回転します。誰かが私の数学のどこが悪いのか教えてもらえますか? ちなみに、ユーザーの指が回転するビューの境界の外にある可能性があるため、ang はスーパービューの座標を使用して角度を計算しますが、それは必要ない場合があります。

ありがとうございました

- (void)rotateItem:(UIPanGestureRecognizer *)recognizer
{
    NSLog(@"Rotate Item");

    float ang = atan2([recognizer locationInView:self.superview].y - self.center.y, [recognizer locationInView:self.superview].x - self.center.x);

    float angleDiff = deltaAngle - ang;
    self.transform = CGAffineTransformRotate(startTransform, -angleDiff);

    CGFloat radians = atan2f(self.transform.b, self.transform.a);
    NSLog(@"rad is %f", radians);
}

#pragma mark - Touch Methods

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)recognizer
{

    if (recognizer == rotateGesture) {
        NSLog(@"rotate gesture started");

        deltaAngle = atan2([recognizer locationInView:self].y-self.center.y, [recognizer locationInView:self].x-self.center.x);

        startTransform = self.transform;
    }

    return YES;
}
4

1 に答える 1

0

ロギングを行ったところ、タッチ ドラッグ イベント中に uiview の中心が変化したようです。したがって、タッチ開始メソッドで uiview の中心を保存し、代わりにそれを使用しました。

- (void)rotateItem:(UIPanGestureRecognizer *)recognizer
    {
        NSLog(@"Rotate Item");

        CGPoint superPoint = [self convertPoint:itemCenter toView:self.superview];

        float ang = atan2([recognizer locationInView:self.superview].y - superPoint.y, [recognizer locationInView:self.superview].x - superPoint.x);

        float angleDiff = deltaAngle - ang;
        self.transform = CGAffineTransformRotate(startTransform, -angleDiff);

    }

    #pragma mark - Touch Methods

    - (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)recognizer
    {

        if (recognizer == rotateGesture) {
            NSLog(@"rotate gesture started");

            deltaAngle = atan2([recognizer locationInView:self.superview].y-self.center.y, [recognizer locationInView:self.superview].x-self.center.x);

            startTransform = self.transform;
        }

        return YES;
    }
于 2012-07-06T20:24:38.317 に答える