Как я могу вращать UIB-кнопку непрерывно и иметь возможность ее остановить?
Я хочу постоянно вращать UIButton, чтобы показать, что приложение что-то записывает. Это хорошая идея. Я также хочу иметь возможность остановить это непрерывное вращение.
Как бы я использовал анимацию, чтобы сделать это?
6 ответов
Используйте метод анимации UIView:
animateWithDuration:delay:options:animations:completion:
и используйте опцию UIViewAnimationOptionRepeat
Например для UIButton *
торговая точка имени button
:
- (void)viewDidLoad
{
[super viewDidLoad];
[UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveLinear animations:^{
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI);
self.button.transform = transform;
} completion:NULL];
}
Поскольку он вращается вокруг меня, я просто поворачиваю его по пи радианам, а не по 2pi. Вы можете использовать любой угол, который вы хотите.
редактировать
Чтобы остановить анимацию, просто создайте другую анимацию короткой продолжительности, начиная с текущего состояния, например
- (void)stopRotating {
[UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveLinear animations:^{
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * 0.05);
self.button.transform = transform;
} completion:NULL];
}
Это обеспечивает очень короткую анимацию, которая переопределяет текущую анимацию. Обратите внимание, что угол преобразования умножается на 0,05, что является отношением 0,1/2,0, что означает, что скорость вращения для этого небольшого сегмента такая же, как и скорость непрерывного вращения.
Попробуйте приведенный ниже код, который поможет вам, потому что я успешно запустил этот код.
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Show View" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[self.view addSubview:button];
CABasicAnimation *halfTurn;
halfTurn = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
halfTurn.fromValue = [NSNumber numberWithFloat:0];
halfTurn.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];
halfTurn.duration = 0.5;
halfTurn.repeatCount = HUGE_VALF;
[[button layer] addAnimation:halfTurn forKey:@"180"];
У меня была такая же проблема сама. В итоге я сделал это так:
#pragma mark Start/StopSpining
-(void)startSpin{
isSpining = YES;
[self Spin];
}
-(void)stopSpin{
isSpining = NO;
}
-(void)spin{
[UIView animateWithDuration:1.0 delay:0 options: UIViewAnimationOptionCurveLinear animations:^{
self.spinCircle.transform = CGAffineTransformRotate(self.spinCircle.transform, M_PI/2);
} completion:^(BOOL finished) {
if (isSpining)
[self spin];
}];
}
Попробуйте ниже расширение для быстрого 3.
extension UIView {
func rotate360Degrees(duration: CFTimeInterval = 3) {
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.fromValue = 0.0
rotateAnimation.toValue = CGFloat(M_PI * 2)
rotateAnimation.isRemovedOnCompletion = false
rotateAnimation.duration = duration
rotateAnimation.repeatCount=Float.infinity
self.layer.add(rotateAnimation, forKey: nil)
}
}
Для начала вращения.
MyButton.rotate360Degrees()
И для Стоп.
MyButton.layer.removeAllAnimations()
Я предлагаю вам не вращать UIButton, просто изображение, которое вы положили на кнопку. Кто знает, какие сложности или чрезмерное вращение прямоугольного объекта, который может обнаружить прикосновения, привносит - что произошло, если пользователь как-то постучал в углу кнопки, а затем отпустил нажатие, когда кнопка повернулась так, что касание теперь снаружи? Это регистрирует касание внутри или нет?
В любом случае, если вы хотите непрерывное вращение, используйте блочный метод:
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
кажется, отвечает всем требованиям. Полное вращение (2pi) будет происходить каждый duration
и вы заставляете его повторяться, пока не прекратите UIViewAnimationOptionRepeat
, Вы можете проверить с completion
чтобы увидеть, следует ли начинать еще один цикл, когда закончился один цикл анимации, и вы можете в любой момент остановить анимацию с помощью
[myView.layer removeAllAnimations];
(Если вы просто хотите запустить его, пока не остановите, то есть другие варианты этого метода без блока завершения)
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.3];
uiButtonObject.transform = CGAffineTransformMakeRotation(M_PI);
[UIView commitAnimations];
M_PI - это значение радиана угла, который вы хотите повернуть. Запустите это в цикле и в другом потоке. Возможно, вы также захотите запустить вышеупомянутое, используя метод executeSelectorInMainThread, поскольку изменения пользовательского интерфейса не допускаются в UIThread.