Вращать UIView вокруг его центра, но несколько раз
Я пытаюсь повернуть некоторые UIView
вокруг его центра, поэтому простой код выглядит примерно так (в псевдокоде):
[UIView beginAnimations:@"crazyRotate" context:nil];
[UIView setAnimationDuration:1.0];
someview.transform = CGAffineTransformMakeRotation(angle);
[UIView commitAnimations]
Теперь, если я установлю угол, чтобы сказать M_PI/2, вещь вращается хорошо. если я установлю его на 2*M_PI, то он ничего не делает. Я могу понять, что матрица переводится во что-то, что ничего не делает (вращение на 360 означает "остаться" в некотором смысле), но я хочу повернуть ее 5 раз (представьте, что масштаб поворота газеты на вас действует - я не отлично подходит для описания, надеюсь, кто-то понимает). Итак, я попытался добавить угол установки до 180 градусов (M_PI) и добавить вложенный animatationBlock
, но я думаю, что так как я устанавливаю то же свойство (someview.transition
) опять это как-то игнорирует). Я попытался установить счетчик повторений анимации на 2 с углом M_PI, но кажется, что он просто поворачивается на 180, возвращается в прямое положение и затем снова запускает вращение.
Так что, я немного вне идей, любая помощь приветствуется! --t
4 ответа
Вы можете использовать следующую анимацию в свойстве слоя UIView. Я проверял это.
UIView *viewToSpin = ...;
CABasicAnimation* spinAnimation = [CABasicAnimation
animationWithKeyPath:@"transform.rotation"];
spinAnimation.toValue = [NSNumber numberWithFloat:5*2*M_PI];
[viewToSpin.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
Как указал Брэд Ларсон, вы можете сделать это с CAKeyframeAnimation
, Например,
CAKeyframeAnimation *rotationAnimation;
rotationAnimation =
[CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.values = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0.0 * M_PI],
[NSNumber numberWithFloat:0.75 * M_PI],
[NSNumber numberWithFloat:1.5 * M_PI],
[NSNumber numberWithFloat:2.0 * M_PI], nil];
rotationAnimation.calculationMode = kCAAnimationPaced;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.fillMode = kCAFillModeForwards;
rotationAnimation.timingFunction =
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
rotationAnimation.duration = 10.0;
CALayer *layer = [viewToSpin layer];
[layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
Вы можете контролировать продолжительность всей анимации с помощью rotationAnimation.duration
свойство, а также ускорение и замедление (и вычисление промежуточных шагов) с rotationAnimation.timingFunction
имущество.
CABasicAnimation* animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat: 2*M_PI];
animation.duration = 8.0f;
animation.repeatCount = INFINITY;
[self.myView.layer addAnimation:animation forKey:@"SpinAnimation"];
Получить эффект непрерывного вращения немного сложно, но я опишу способ сделать это здесь. Да, Core Animation, похоже, оптимизирует преобразования до ближайшей конечной позиции внутри единичного круга. Метод, который я описываю, объединяет несколько анимаций с половинным вращением для создания полных вращений, хотя вы заметили небольшое заикание в передаче обслуживания от одной анимации к другой.
Возможно, CAKeyframeAnimation, созданный с этими значениями половинного поворота, будет правильным решением. Тогда вы также можете контролировать ускорение и замедление.