Как я могу вращать 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.

Другие вопросы по тегам