Свойство transform в CGPathAddEllipseInRect - PullRequest
1 голос
/ 27 апреля 2011

Я использую CGPathAddEllipseInRect, чтобы нарисовать круг, а затем использую его в CAKeyframeAnimation.Моя проблема в том, что анимация всегда начинается в одном и том же месте.Я думал, что мог бы сделать следующее с CGAffineTransform, чтобы запустить его в другой точке:

CGAffineTransform temp = CGAffineTransformMakeRotation(M_PI / 2);
CGPathAddEllipseInRect(animationPath , &temp, rect);

Я не знаю, что это делает.Когда он запускается, я даже не вижу эту часть анимации.Это делает что-то за кадром.Любая помощь, понимающая это, была бы великолепна.

1 Ответ

5 голосов
/ 27 апреля 2011

Вращение происходит вокруг начала координат (0,0) по умолчанию, но вы хотите вращаться вокруг центра круга, поэтому вам нужно выполнить дополнительные преобразования:

float midX = CGRectGetMidX(rect);
float midY = CGRectGetMidY(rect);
CGAffineTransform t = 
    CGAffineTransformConcat(
        CGAffineTransformConcat(
            CGAffineTransformMakeTranslation(-midX, -midY), 
            CGAffineTransformMakeRotation(angle)), 
        CGAffineTransformMakeTranslation(midX, midY));
CGPathAddEllipseInRect(animationPath, &t, rect);

По сути, это объединяет три преобразования: сначала круг перемещается в начало координат (0,0), затем применяется вращение, а затем он возвращается в исходное положение. Я сделал небольшую визуализацию, чтобы проиллюстрировать эффект:

Я выбрал квадрат вместо круга и 45 ° вместо 90 °, чтобы было легче увидеть поворот, но принцип тот же.

...