Подтвердить что ты не робот

Как я могу вращать UIButton непрерывно и быть в состоянии остановить его?

Я хочу постоянно поворачивать UIButton, чтобы показать, что приложение что-то записывает. Это хорошая идея. Я также хочу, чтобы остановить это непрерывное вращение.

Как использовать анимацию для этого?

4b9b3361

Ответ 1

Используйте метод анимации 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, что означает, что скорость вращения для этого маленького сегмента такая же, как и непрерывная скорость вращения.

Ответ 2

Попробуйте под кодом, который поможет вам, потому что я успешно запустил этот код.

    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"];

Ответ 3

У меня была такая же проблема. В конце концов я сделал это так:

#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];
                 }];
}

Ответ 4

Попробуйте добавить расширение для быстрого 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()

Ответ 5

Я предлагаю вам не вращать 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];

(Если вы просто хотите запустить его, пока не остановите его, тогда есть другие варианты этого метода без блока завершения)

Ответ 6

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDelegate:self];

[UIView setAnimationDuration:0.3];

uiButtonObject.transform = CGAffineTransformMakeRotation(M_PI);

[UIView commitAnimations];

M_PI - радианное значение угла, который вы хотите вращать. Запустите это в цикле и в другом потоке. Вы также можете запустить вышеуказанное, используя метод performSelectorInMainThread, поскольку изменения UI не разрешены в UIThread.