0

矢印の画像を持つUIImageViewが1つあります。ユーザーがUIViewをタップすると、この矢印はタップの方向を指し、その位置を維持する必要があり、変換を変更するだけです。次のコードを実装しました。しかし、期待どおりに機能していません。スクリーンショットを追加しました。このスクリーンショットでは、左上のポイントをタッチすると、矢印の方向は次のようになりますが、実際にはそうではありません。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

 UITouch *touch=[[event allTouches]anyObject];
 touchedPoint= [touch locationInView:touch.view];
 imageViews.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(rangle11));
 previousTouchedPoint = touchedPoint ;
}

- (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint
{

 CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start
   float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians
float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees
bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity
return bearingDegrees;
}

ここに画像の説明を入力してください

4

4 に答える 4

5

タッチした場所を指し示す矢印の画像が必要だったと思います。試してみたところ、これが思いついたものです。矢印が上向きの画像ビューを配置し(他の位置から開始しようとはしていません。ログは正しい角度を示します)、さまざまな場所に触れると、回転して触れた場所を指します。それが役立つことを願っています(いくつかの古い数学を試しました:-))

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch=[[event allTouches]anyObject];
    touchedPoint= [touch locationInView:touch.view];
    CGFloat angle = [self getAngle:touchedPoint];
    imageView.transform = CGAffineTransformMakeRotation(angle);

}

-(CGFloat) getAngle: (CGPoint) touchedPoints
{
    CGFloat x1 = imageView.center.x;
    CGFloat y1 = imageView.center.y;

    CGFloat x2 = touchedPoints.x;
    CGFloat y2 = touchedPoints.y;

    CGFloat x3 = x1;
    CGFloat y3 = y2;

    CGFloat oppSide = sqrtf(((x2-x3)*(x2-x3)) + ((y2-y3)*(y2-y3)));
    CGFloat adjSide = sqrtf(((x1-x3)*(x1-x3)) + ((y1-y3)*(y1-y3)));

    CGFloat angle = atanf(oppSide/adjSide);
    // Quadrant Identifiaction
    if(x2 < imageView.center.x)
    {
        angle = 0-angle;
    }


    if(y2 > imageView.center.y)
    {
        angle = M_PI/2 + (M_PI/2 -angle);
    }
     NSLog(@"Angle is %2f",angle*180/M_PI);
    return angle;

}

-anoop4real

于 2012-07-20T10:44:41.617 に答える
1

あなたが私に言ったことを考えると、問題はあなたが変換をリセットしていないことだと思いますtouchesBegan. 次のように変更してみて、うまく機能するかどうかを確認してください。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

 UITouch *touch=[[event allTouches]anyObject];
 touchedPoint= [touch locationInView:touch.view];
 imageViews.transform = CGAffineTransformIdentity;
 imageViews.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(rangle11));
 previousTouchedPoint = touchedPoint ;
}
于 2012-07-12T13:12:38.157 に答える
1

必要なのは、矢印が最後にタップされたポイントを指していることです。簡単にしてテストするために、タップ ジェスチャを使用しました (ただし、touchBegan:withEvent: に似ています)。

viewDidLoad メソッドで、ジェスチャーを登録します。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
[self.view addGestureRecognizer:tapGesture];
[tapGestureリリース];

各タップで呼び出されるメソッド:

- (void)tapped:(UITapGestureRecognizer *)ジェスチャー
{
    CGPoint imageCenter = mFlecheImageView.center;
    CGPoint tapPoint = [ジェスチャー locationInView:self.view];

    double deltaY = tapPoint.y - imageCenter.y;
    double deltaX = tapPoint.x - imageCenter.x;
    double angleInRadians = atan2(deltaY, deltaX) + M_PI_2;

    mFlecheImageView.transform = CGAffineTransformMakeRotation(angleInRadians);
}

UIKit+ M_PI_2座標の原点は左上隅にあります(三角関数では左下隅を使用します)。

于 2012-07-17T18:38:05.973 に答える
1

「不連続を取り除く」という行が必要ですか?atan2f()+π から -π の間の値を返すようです。それらは直接動作しCATransform3DMakeRotation()ませんか?

于 2012-07-17T07:33:21.050 に答える