Я хочу постоянно поворачивать UIButton, чтобы показать, что приложение что-то записывает. Это хорошая идея. Я также хочу, чтобы остановить это непрерывное вращение.
Как использовать анимацию для этого?
Я хочу постоянно поворачивать UIButton, чтобы показать, что приложение что-то записывает. Это хорошая идея. Я также хочу, чтобы остановить это непрерывное вращение.
Как использовать анимацию для этого?
Используйте метод анимации 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];
}
Поскольку он идет круглым, я просто поворачиваю его на pi radians, а не на 2pi. вы можете использовать любой угол, который вы хотите.
Edit
Чтобы остановить анимацию, просто создайте еще одну анимацию короткой продолжительности, начиная с текущего состояния, например.
- (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 - радианное значение угла, который вы хотите вращать. Запустите это в цикле и в другом потоке. Вы также можете запустить вышеуказанное, используя метод performSelectorInMainThread, поскольку изменения UI не разрешены в UIThread.