2013-08-27 3 views
0

Я пытаюсь анимировать вид из центра экрана в верхний левый угол в режиме спирального типа. Вот что я делаю:анимация спирального пути с использованием CGMutablePathRef

CGMutablePathRef curvedPath = CGPathCreateMutable(); 
    CGPathMoveToPoint(curvedPath, NULL, viewOrigin.x, viewOrigin.y); 

     controlX1 = viewOrigin.x + halfScreenWidth*0.3; 
     controlY1 = viewOrigin.y + halfScreenHeight*0.1; 
     controlX2 = viewOrigin.x - halfScreenWidth*0.05; 
     controlY2 = viewOrigin.y + halfScreenHeight*0.5; 
     controlX3 = viewOrigin.x - halfScreenWidth*0.4; 
     controlY3 = viewOrigin.y; 

     rndX1 = viewOrigin.x + halfScreenWidth*.1; 
     rndX2 = viewOrigin.x - halfScreenWidth*.40; 
     rndY1 = viewOrigin.y + halfScreenHeight*.10; 
     rndY2 = viewOrigin.y + halfScreenHeight*.35; 
    } 


    CGPathAddQuadCurveToPoint(curvedPath, NULL, controlX1, controlY1, rndX1, rndY1); 
    CGPathAddQuadCurveToPoint(curvedPath, NULL, controlX2, controlY2, rndX2, rndY2); 
    CGPathAddQuadCurveToPoint(curvedPath, NULL, controlX3, controlY3, endPoint.x, endPoint.y); 

    pathAnimation.path = curvedPath; 
    CGPathRelease(curvedPath); 

CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.fillMode = kCAFillModeForwards; 
    [group setAnimations:[NSArray arrayWithObjects: pathAnimation, nil]]; 
    group.duration = 3.0f; 
    group.delegate = self; 
    [group setValue:self.theView forKey:@"imageViewBeingAnimated"]; 

В представлении перемещается в каждой точке на кривой, но это не так гладко, и не очень соблазнительная либо. Он просто перемещается в значительной степени по прямой линии в каждую точку. Почему не путь изогнут? Я использую this в качестве ссылки.

+0

насчет остальной части анимации по ключевым кадрам? –

+0

Я не уверен, что это релевантно, но я добавил его выше. – soleil

+0

Я запустил код, который вы указали выше (но мне пришлось заполнить некоторые из моих собственных значений для endPath, viewOrigin, pathAnimation, theView и т. Д.). Он идет по пути, как я ожидал бы этого. Я предлагаю вам установить путь к слою с гладкими фигурами, чтобы увидеть, действительно ли путь является тем, что вы думаете. В противном случае вам нужно предоставить дополнительную информацию, чтобы другие могли воспроизвести проблему. –

ответ

0

Если вы хотите более гладкую спираль, вы можете использовать следующую функцию. Можно также настроить код, чтобы иметь открытую спираль.

-(void)addEnteringSpiralOnPath: (CGMutablePathRef) path 
          size: (CGSize)size 
         turns: (int)turns 
{ 
    CGPathMoveToPoint(path, NULL, size.width/2, 0); //To begining: Right 

    for (int turn = turns; turn >= 1; turn--) { 
     CGSize largeSize = CGSizeMake(size.width * turn/turns, size.height * turn/turns); 
     CGSize smallSize = CGSizeMake(size.width * (turn-1)/turns, size.height * (turn-1)/turns); 
     NSLog(@"Large: %@; Small: %@", NSStringFromCGSize(largeSize), NSStringFromCGSize(smallSize)); 

     CGFloat wStep = (largeSize.width/2 - smallSize.width/2)/360; 
     CGFloat hStep = (largeSize.height/2 - smallSize.height/2)/360; 

     for (CGFloat i = 0; i<=360; i = i + 10) { 
      CGFloat iRad = i * M_PI/180.0f; 
      CGPoint p = CGPointMake(cosf(iRad) * (largeSize.width/2 - wStep * i), 
            sinf(iRad) * (largeSize.height/2 - hStep * i)); 
      CGPathAddLineToPoint(path, nil, p.x, p.y); 
     } 
    } 

} 
-(void)addOpenningSpiralOnPath: (CGMutablePathRef) path 
          size: (CGSize)size 
         turns: (int)turns 
{ 
    CGPathMoveToPoint(path, NULL, 0, 0); //To begining: Center 

    for (int turn = 1; turn <= turns; turn++) { 
     CGSize largeSize = CGSizeMake(size.width * turn/turns, size.height * turn/turns); 
     CGSize smallSize = CGSizeMake(size.width * (turn-1)/turns, size.height * (turn-1)/turns); 
     NSLog(@"Large: %@; Small: %@", NSStringFromCGSize(largeSize), NSStringFromCGSize(smallSize)); 

     CGFloat wStep = (largeSize.width/2 - smallSize.width/2)/360; 
     CGFloat hStep = (largeSize.height/2 - smallSize.height/2)/360; 

     for (CGFloat i = 0; i<=360; i = i + 10) { 
      CGFloat iRad = i * M_PI/180.0f; 
      CGPoint p = CGPointMake(cosf(iRad) * (smallSize.width/2 + wStep * i), 
            sinf(iRad) * (smallSize.height/2 + hStep * i)); 
      CGPathAddLineToPoint(path, nil, p.x, p.y); 
     } 
    } 
} 

Тогда вам просто нужен простой подобный код, чтобы сделать путь:

CGMutablePathRef pathToDraw = CGPathCreateMutable(); 

    [self addEnteringSpiralOnPath:pathToDraw size:CGSizeMake(400, 400) turns:3];