Я пытаюсь остановить/удалить бесконечную анимацию ограничения после ее запуска. В основном у меня есть поле, которое имеет ограничение равной высоты основного вида с умножителем 0.5. Коробка должна расти и сокращаться, изменяя множитель до 0,8 и обратно до 0,5 - UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat. Поскольку множитель доступен только для чтения, единственный способ оживить это - удалить ограничение и добавить его обратно с помощью множителя. поле прекрасно анимируется, но метод остановки вообще не работает, используя классические способы остановки анимации UIView.Stop Infinite Constraint Animation
Я могу остановить анимацию, если я живой 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];
}
'[self.box.layer removeAllAnimations]' работает для меня. Вы уверены, что вызываются «stopAnimations»? – rdelmar
@rdelmar Да, я уверен. Единственный эффект, который я получаю, это то, что координаты коробки меняются, и окно больше не будет анимироваться вокруг центра обзора, но оно все еще оживляет (растет> сокращается). [self.box animationKeys] возвращает ключ bounds.size, который удаляется с помощью removeAllAnimations, но опять же, что по какой-то причине только изменяет положение поля. –
удалите '[self.view layoutIfNeeded];' перед блоком анимации, кроме того, что он работает, остановка резко скачет, но это другая проблема. Возможно, вам стоит взглянуть на изменение приоритетов, а не на добавление и удаление ограничений все время. – luk2302