Как я могу вращать UIB-кнопку непрерывно и иметь возможность ее остановить? - PullRequest
12 голосов
/ 07 сентября 2011

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

Как бы я использовал анимацию, чтобы сделать это?

Ответы [ 6 ]

35 голосов
/ 07 сентября 2011

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

6 голосов
/ 07 сентября 2011

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

    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 голосов
/ 01 июня 2014

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

#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];
                 }];
}
2 голосов
/ 15 декабря 2016

Попробуйте ниже расширение для Swift 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()
0 голосов
/ 07 сентября 2011

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

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

0 голосов
/ 07 сентября 2011
[UIView beginAnimations:nil context:nil];

[UIView setAnimationDelegate:self];

[UIView setAnimationDuration:0.3];

uiButtonObject.transform = CGAffineTransformMakeRotation(M_PI);

[UIView commitAnimations];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...