После анимации просмотр позиции сбрасывается
Я пытаюсь сделать снимок слайда сверху вниз. Это неважно, я использовал CABasicAnimation
для этого. Проблема в том, когда я хочу удалить представление. Я использую эту анимацию.
CABasicAnimation *animation;
animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setDelegate:self];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.layer.position.x, 0 - self.view.bounds.size.height / 2)];
animation.fromValue = [NSValue valueWithCGPoint:self.view.layer.position];
animation.autoreverses = NO;
animation.repeatCount = 0;
animation.duration = 0.25;
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
[self.view.layer addAnimation:animation forKey:@"moveX"];
Анимирует представление отлично. Но после окончания анимации мое представление появляется снова. Поэтому я добавил эту строку:
[self.view removeFromSuperview];
Что удаляет вид, но без анимации. Поэтому я решил добавить код удаления в этот делегат:
-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag
Итак, теперь анимация работает, представление исчезает, но иногда я вижу, что представление появляется и исчезает быстрее, как после анимации, появляется представление, затем вызывается делегат animationDidStop
, и представление исчезает, очевидно, это ужасно. Что я делаю неправильно?
Ответы
Ответ 1
Хорошо, согласно образцу Apple "MoveMe", это (removedOnCompletion) должно работать, однако, похоже, это не так.
Итак, добавьте эти строки после кода:
[self.view.layer addAnimation:animation forKey:@"moveX"];
self.view.layer.position = [animation.toValue CGPointValue];
Это гарантирует, что после запуска анимации слой будет правильно расположен.
Ответ 2
Возможно, вы захотите установить эти свойства. Они приводят к тому, что презентация сохраняется в конце анимации.
animation.fillMode = kCAFillModeForwards;
animation.removedOnCompletion = NO;
Затем метод "animationDidStop:" может быть использован для удаления представления в конце анимации:
-(void) animationDidStop:(CAAnimation *) animation finished:(bool) flag {
if (animation == [containerView.layer animationForKey:@"moveX"]) {
// remove view here, add another view and/or start another transition
}
}
Ответ 3
У меня была эта проблема при выполнении нескольких анимаций в анимационной группе. Мне пришлось установить пару свойств самой группы анимации, а не отдельные анимации.
CAAnimationGroup *animGroup = [CAAnimationGroup animation];
// MAKE SURE YOU HAVE THESE TWO LINES.
animGroup.removedOnCompletion = NO;
animGroup.fillMode = kCAFillModeForwards;
animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, nil];
animGroup.duration = tAnimationDuration;
[tImageView.layer addAnimation:animGroup forKey:nil];
Ответ 4
Устанавливать представление скрытым, как предлагает Rob, должно это сделать.
Для свойств свойств я бы придерживался стиля ObjC 2.0, как у вас уже есть в вашем коде.
set.view.hidden = YES;
Ответ 5
Это тоже немного. Вы хотите установить для анимации removeOnCompletion флаг NO. По умолчанию используется значение YES, что означает, что после завершения анимации оно удаляется, а представление возвращается в исходное состояние.
Ответ 6
Можете ли вы установить скрытое свойство вида на ДА?
Я думаю, это будет:
self.view.hidden = YES;
Но это может быть:
[self.view setHidden:YES];
Оказывается, я довольно хромаю, когда выясняю правильный способ доступа к свойствам свойств.