После анимации просмотр позиции сбрасывается - PullRequest
27 голосов
/ 22 октября 2008

Я пытаюсь сделать слайд вида сверху вниз. Это не имеет большого значения, я использовал 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 и вид исчезает Очевидно, это ужасно. Что я делаю не так?

Ответы [ 6 ]

66 голосов
/ 30 октября 2008

Возможно, хотите установить эти свойства. Они заставляют представление сохраняться в конце анимации.

animation.fillMode = kCAFillModeForwards;<br> 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
    }
}
15 голосов
/ 23 октября 2008

Что ж, согласно образцу Apple MoveMe, это ( removeOnCompletion ) должно работать, но, похоже, не работает.

Итак, добавьте эти строки после кода: [self.view.layer addAnimation:animation forKey:@"moveX"]; self.view.layer.position = [animation.toValue CGPointValue];

Это гарантирует, что после запуска анимации слой будет правильно расположен.

3 голосов
/ 26 февраля 2013

У меня была эта проблема при выполнении нескольких анимаций в анимационной группе. Мне пришлось установить пару свойств для самой группы анимации, а не для отдельных анимаций.

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];
0 голосов
/ 22 октября 2008

Этот укусил меня тоже. Вы хотите установить флаг анимации removeOnCompletion в NO. По умолчанию используется значение YES, что означает, что после завершения анимации оно удаляется, и представление возвращается в исходное состояние.

0 голосов
/ 22 октября 2008

Установка вида скрытого, как предлагает Роб, должен это сделать.

Для свойств свойств я бы придерживался стиля ObjC 2.0, который вы уже использовали в своем коде.

set.view.hidden = YES;
0 голосов
/ 22 октября 2008

Можете ли вы установить для скрытого свойства представления значение YES?

Я думаю, что это будет:

self.view.hidden = YES;

Но это может быть:

[self.view setHidden:YES];

Оказывается, я довольно отстала в поисках правильного способа доступа к свойствам свойств.

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