2015-05-22 3 views
0

Я пытаюсь остановить/удалить бесконечную анимацию ограничения после ее запуска. В основном у меня есть поле, которое имеет ограничение равной высоты основного вида с умножителем 0.5. Коробка должна расти и сокращаться, изменяя множитель до 0,8 и обратно до 0,5 - UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat. Поскольку множитель доступен только для чтения, единственный способ оживить это - удалить ограничение и добавить его обратно с помощью множителя. поле прекрасно анимируется, но метод остановки вообще не работает, используя классические способы остановки анимации UIView.Stop Infinite Constraint Animation

enter image description here

Я могу остановить анимацию, если я живой box.transofrm = CGAffineTransformMakeScale (1.0f, 0.8f), но делать это вместо того, чтобы анимировать ограничение себя в то время как Auto Layout включена не рекомендуется.

Вот мой код

// wired equal height constraint between box and view with multiplier 0.5 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *boxEqualHeightConstraint; 

.

-(void)startAnimation { 
     // animation starts fine 
     [self.view removeConstraint:self.boxEqualHeightConstraint]; // remove multi 0.5 
     self.boxEqualHeightConstraint = [NSLayoutConstraint constraintWithItem:self.box 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:self.view 
                   attribute:NSLayoutAttributeHeight 
                   multiplier:0.8 
                   constant:0]; 

     [self.view addConstraint:self.boxEqualHeightConstraint]; // add multi 0.8 
     [self.view layoutIfNeeded]; 
     [UIView animateWithDuration:1.0f delay:0 options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations:^{ 
      [self.view layoutIfNeeded]; 

     } completion:nil]; 

    } 

-(void)stopAnimations { 

    [self.view.layer removeAllAnimations]; // not working 
    [self.box.layer removeAllAnimations]; // not working 


    // I tried replacing the constraint animation, but it is still growing and shrinking indefinitely. 
    [self.view removeConstraint:self.boxEqualHeightConstraint]; 
    self.boxEqualHeightConstraint = [NSLayoutConstraint constraintWithItem:self.box 
                  attribute:NSLayoutAttributeHeight 
                  relatedBy:NSLayoutRelationEqual 
                   toItem:self.view 
                  attribute:NSLayoutAttributeHeight 
                  multiplier:0.5 
                  constant:0]; 

    [self.view addConstraint:self.boxEqualHeightConstraint]; 

    [self.view layoutIfNeeded]; 
    [UIView animateWithDuration:1.0f delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     [self.view layoutIfNeeded]; 
    } completion:nil]; 

} 
+0

'[self.box.layer removeAllAnimations]' работает для меня. Вы уверены, что вызываются «stopAnimations»? – rdelmar

+0

@rdelmar Да, я уверен. Единственный эффект, который я получаю, это то, что координаты коробки меняются, и окно больше не будет анимироваться вокруг центра обзора, но оно все еще оживляет (растет> сокращается). [self.box animationKeys] возвращает ключ bounds.size, который удаляется с помощью removeAllAnimations, но опять же, что по какой-то причине только изменяет положение поля. –

+0

удалите '[self.view layoutIfNeeded];' перед блоком анимации, кроме того, что он работает, остановка резко скачет, но это другая проблема. Возможно, вам стоит взглянуть на изменение приоритетов, а не на добавление и удаление ограничений все время. – luk2302

ответ

0

Я узнал, в чем причина анимации не остановится. Мой self.box (который является UIButton) содержал изображение.

Что еще анимация после удаленияAllAnimations - это просто изображение внутри коробки, а не само окно.

так, чтобы остановить это сделать:

[self.box.imageView.layer removeAllAnimations];