Как сделать полный поворот кругового объекта с помощью анимации uiview
Я пытаюсь перебрать частичные круги, чтобы добиться анимации, но она поворачивается только на 180 градусов, а затем снова начинается с 0 градусов до 180 градусов. Так что есть резкий скачок от 180 градусов до 360 градусов. Как сделать так, чтобы объект кругового изображения вращался непрерывно без каких-либо скачков? Вот мой текущий код:
UIViewAnimationOptions options = UIViewAnimationOptionCurveLinear|UIViewAnimationOptionRepeat;
[UIView animateWithDuration:ROTATE_ANIMATION_DURATION/2 delay:0 options:options
animations:^{
view.transform = CGAffineTransformRotate(transform, M_PI);}//1st step of animation finished
completion:^(BOOL finished) {
[UIView animateWithDuration:ROTATE_ANIMATION_DURATION/2 delay:0 options:options
animations:^{
view.transform = CGAffineTransformRotate(transform, M_PI);} //2nd step of animation finished
completion:^(BOOL finished) {nil;
}];
4 ответа
Spin UI Object, анимация вращения на 360 градусов
вам нужно будет добавить QuartzCore Framework в ваш проект и включить
#import QuartzCore/QuartzCore.h
Добавить анимацию для объекта:
CABasicAnimation *fullRotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
fullRotation.fromValue = [NSNumber numberWithFloat:0];
fullRotation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
fullRotation.duration = 6;
fullRotation.repeatCount = 1e100f;
[myview.layer addAnimation:fullRotation forKey:@"360"];
Я нашел какой-то старый код, который использую для поворота вида на 360 градусов, надеюсь, это поможет. Вам нужно будет импортировать QuartzCore.
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.zRad"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0];
rotationAnimation.duration = 3;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = INFINITY;
rotationAnimation.timingFunction =
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[viewToAnimate.layer addAnimation:rotationAnimation forKey:@"transform.rotation.zRad"];
Существуют следующие способы выполнения 360-градусной анимации с помощью UIView.
Использование CABasicAnimation
var rotationAnimation = CABasicAnimation()
rotationAnimation = CABasicAnimation.init(keyPath: "transform.rotation.z")
rotationAnimation.toValue = NSNumber(value: (Double.pi * 2.0))
rotationAnimation.duration = 1.0
rotationAnimation.isCumulative = true
rotationAnimation.repeatCount = 100.0
view.layer.add(rotationAnimation, forKey: "rotationAnimation")
Вот функции расширения для UIView, которые обрабатывают запуск и остановку операций вращения:
extension UIView {
// Start rotation
func startRotation() {
let rotation = CABasicAnimation(keyPath: "transform.rotation.z")
rotation.fromValue = 0
rotation.toValue = NSNumber(value: Double.pi * 2)
rotation.duration = 1.0
rotation.isCumulative = true
rotation.repeatCount = FLT_MAX
self.layer.add(rotation, forKey: "rotationAnimation")
}
// Stop rotation
func stopRotation() {
self.layer.removeAnimation(forKey: "rotationAnimation")
}
}
Теперь используем закрытие UIView.animation:
UIView.animate(withDuration: 0.5, animations: {
view.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi))
}) { (isAnimationComplete) in
UIView.animate(withDuration: 0.5) {
view.transform = CGAffineTransform(rotationAngle: (CGFloat(Double.pi))
}
}
BOOL animating;
- (void)spinWithOptions:(UIViewAnimationOptions)options {
[UIView animateWithDuration:0.5
delay:0
options:options
animations:^{
self.imageToMove.transform = CGAffineTransformRotate(imageToMove.transform, M_PI / 2);
}
completion:^(BOOL finished) {
if (finished) {
if (animating) {
[self spinWithOptions: UIViewAnimationOptionCurveLinear];
} else if (options != UIViewAnimationOptionCurveEaseOut) {
[self spinWithOptions: UIViewAnimationOptionCurveEaseOut];
}
}
}];
}
- (void)startSpin {
if (!animating) {
animating = YES;
[self spinWithOptions: UIViewAnimationOptionCurveEaseIn];
}
}
- (void)stopSpin {
// set the flag to stop spinning after one last 90 degree increment
animating = NO;
}
Вы можете запускать и останавливать анимацию вида, вызывая методы startSpin и stopSpin соответственно.
И вот быстрый ответ:
func spin(with options: UIViewAnimationOptions) {
UIView.animate(withDuration: 0.5, delay: 0, options: options,
animations: {() -> Void in
self.imageToRotate.transform = self.imageToRotate.transform.rotated(by: .pi / 2)
}, completion: {(_ finished: Bool) -> Void in
if finished {
if self.animating {
self.spin(with: .curveLinear)
}
else if options != .curveEaseOut {
self.spin(with: .curveEaseOut)
}
}
})
}
func startSpin() {
if !animating {
animating = true
spin(with: .curveEaseIn)
}
}
func stopSpin() {
animating = false
}