0
votes

In my app I'm using CATransform3DMakeRotation to rotate a UIView moving a finger on it, try to imagine a Knob. My problem is that everything is working good, the moves as I want but when I touch on it ot start rotating it rotates by 180 degrees on the center, I can't understand why.

I show you my code:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
        {
        if (Tag ==subView.tag)

            {
                   CGPoint Location  = [[touches anyObject] locationInView:subView.superview];
                 int x = subView.center.x;
                 int y = subView.center.y;
                 float dx = Location.x - x;
                 float dy = Location.y - y;
                 double a = atan2f(-dx, dy);

                subView.layer.position  = subView.center;
                 subView.layer.transform = CATransform3DMakeRotation(a, 0, 0, 1);
        }}




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

if (Tag ==subView.tag) 

    {   
        [self touchesBegan:touches withEvent:event];
}}

edit : here how i solve the problem

CGPoint Location  = [withTheTouch locationInView:theViewToRotate.superview];
    NSLog(@"location x%f",Location.x);
    NSLog(@"location y%f",Location.y);
    int x = theViewToRotate.center.x;
    int y = theViewToRotate.center.y;
    NSLog(@" X %i",x);
    NSLog(@" Y %i",y);
    float dy;
    float dx;

    if (Location.y < theViewToRotate.center.y) 
    {
        dx = x- Location.x;
        dy = y- Location.y;

        NSLog(@"dx %f",dx);
        NSLog(@"dy %f",dy);
        NSLog(@"sopra il View.Center");

    } else {

        dx = Location.x - x;
        dy = Location.y - y;
        NSLog(@"sotto il View.Center");

    }
    float ang = atan2(-dx, dy);
    NSLog(@"anchorPoint %@",NSStringFromCGPoint(theViewToRotate.layer.anchorPoint));
    NSLog(@"Position %@",NSStringFromCGPoint(theViewToRotate.layer.position));
    NSLog(@"angle %f",ang);
    //theViewToRotate.layer.position  = theViewToRotate.center;


if(ang)

     {
        theViewToRotate.layer.transform = CATransform3DMakeRotation(ang, 0, 0, 1);  //ruoto sul vettore Z

    } 
    else 
    {
        //theViewToRotate.frame = CGRectMake(theViewToRotate.frame.origin.x, theViewToRotate.frame.origin.y , theViewToRotate.frame.size.width, theViewToRotate.frame.size.height );
    }

the problem was on the point where I touch in the view.

Now I need to understand how to lock the rotation between 2 angles. I don't ned 360° rotation.

1

1 Answers

0
votes

hi the reason this was happening is because the view itself has an existing rotation. you need to get the current rotation and start rotating from there.

what youre doing is always starting from here CATransform3DMakeRotation(a, 0, 0, 1);

which has its own pre defined rotation. hence the 180 degree shift when you touch it. this wont happen if you start the rotation from the rotation of the current view.

hope that helps