CGAffineTransformRotate для поворота количество раз, а не на угол

#iphone #objective-c #xcode #cocoa-touch

#iPhone #objective-c #xcode #cocoa-touch

Вопрос:

Кажется, что это поворачивается на угол, а не на величину. Мне нужно использовать это в анимации UIView, чтобы несколько раз повернуть изображение на себя. Есть альтернатива?

CGAffineTransformRotate(transform, 1.0);

Ответ №1:

Преобразование поворота поворачивается на заданный угол, но я предполагаю, что вы пытаетесь добиться поворота на 360 градусов (или более). Для этого вам нужно будет использовать a CAAnimation для его достижения… Пример:

 CABasicAnimation* spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
spinAnimation.duration = 5.0;
spinAnimation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
spinAnimation.toValue = [NSNumber numberWithFloat: 2.0 * M_PI * 20.0];
[myView.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
  

Приведенный выше код повернет MyView 20 раз за 5 секунд

Комментарии:

1. Это не совсем то, что он спрашивает.

Ответ №2:

Я думаю, ключевым моментом здесь является то, что параметр CGAffineTransformRotate ожидается в радианах, а не «количество оборотов». К счастью, достаточно легко преобразовать «количество поворотов» в радианы путем умножения на (2.0 * M_PI).

Комментарии:

1. Да, я это понимаю. Но это все еще не решает проблему.

2. Ах … вы имеете в виду, что CGAffineTransformRotate, похоже, нормализуется до диапазона -2pi < X < 2pi. Мм / ч. Я подозреваю, что вам, вероятно, нужно будет сделать что-то похожее на то, что предложил @AshleyMills, но если это предложение не работает из коробки, вы можете попробовать делать это поэтапно, с одним поворотом на «этап».

3. Да, подход @AshleyMills работает правильно, для меня из коробки. Прав ли Саймонли в том, что это как-то не то, о чем вы спрашивали?

Ответ №3:

Вам нужно сохранить текущее преобразование и снова повернуть … так что вам нужно…

 [myView setTransform:CGAffineTransformRotate(myView.transform, 1.0)];
  

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

Комментарии:

1. Применение CGAffineTransformRotate несколько раз по-прежнему нормализуется до диапазона -2pi < X < 2pi. Например: это не работает. CGAffineTransform originalTransform = CGAffineTransformIdentity; originalTransform = CGAffineTransformRotate(originalTransform, (CGFloat) (M_PI)); originalTransform = CGAffineTransformRotate(originalTransform, (CGFloat) (M_PI));