Поверните UIView влево и вправо с помощью CATransform3DMakeRotation - PullRequest
0 голосов
/ 04 декабря 2011

В моем приложении я использую CATransform3DMakeRotation, чтобы вращать UIView, перемещая палец по нему, попробуйте представить себе регулятор. Моя проблема в том, что все работает хорошо, двигается так, как я хочу, но когда я касаюсь его, не начинаю вращать, он поворачивается на 180 градусов по центру, я не могу понять, почему.

Я покажу вам свой код:

-(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];
}}

изменить: вот как я решаю проблему

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 );
    }

проблема была в точке, где я касаюсь в представлении.

Теперь мне нужно понять, как заблокировать вращение между двумя углами. Мне не нужно вращение на 360 °.

1 Ответ

0 голосов
/ 04 сентября 2012

Привет, причина, по которой это происходило, в том, что само представление имеет существующее вращение вам нужно получить текущее вращение и начать вращаться оттуда.

отсюда всегда начинается то, что вы делаете CATransform3DMakeRotation (a, 0, 0, 1);

, который имеет свой собственный предопределенный поворот. следовательно, смещение на 180 градусов при касании. этого не произойдет, если вы начнете вращение с вращения текущего представления.

надеюсь, что поможет

...