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