Дисплеи UIView неправильно после его слоя были анимированы

У меня есть проблема, которую я не понимаю относительно UIViews и Базовой Анимации. Вот то, что я хочу сделать:

  • Маленькое представление представлено выше большего представления путем помещения его как одного из его подпредставлений.
  • Когда я нажимаю кнопку в этом представлении, представление должно минимизировать и переместиться в указанный CGRect.
  • Затем представление удалено из своего суперпредставления.

В первый раз, когда я представляю, минимизировать-и-перемещать и удаляю представление, все хорошо работает. Но когда я представляю представление снова, оно отображается в измененном положении (даже при том, что оно, как предполагается, установлено в исходном положении вызовом к theView.frame = CGRectMake(600.0, 160.0, 339.0, 327.0);), в то время как все различные элементы респондента (кнопки, textviews, и т.д.) содержавшийся в представлении действуют, как будто они были в исходном положении. Это похоже на представление, и слой получает dissynchronized анимацией, и я не знаю, как вернуть их в синхронизации.

Наличие чего-то как self.view.layer.frame = CGRectMake(600.0, 160.0, 339.0, 327.0); ни в чем не разбирается.

Мой код анимации минимизировать-и-перемещать дан ниже:

    [CATransaction flush];
    CABasicAnimation *scale, *translateX, *translateY; 
    CAAnimationGroup *group = [CAAnimationGroup animation]; 
    group.delegate = delegate; 
    group.duration = duration; 

    scale = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
    translateX = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"]; 
    translateY = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"]; 

    scale.toValue = [NSNumber numberWithFloat:0.13];
    translateX.toValue = [NSNumber numberWithFloat:137.0];
    translateY.toValue = [NSNumber numberWithFloat:-290.0];

    group.animations = [NSArray arrayWithObjects: scale, translateX, translateY, nil];
    group.fillMode = kCAFillModeForwards; 
    group.removedOnCompletion = NO;

    [theView.layer addAnimation:group forKey:@"MyAnimation"];

Как вернуть слой к представлению после анимации?

1
задан KPM 18 June 2014 в 17:40
поделиться

1 ответ

Что произойдет, если вы удалите эти две строки?

group.fillMode = kCAFillModeForwards; 
group.removedOnCompletion = NO;

С помощью этих строк вы сообщаете основной анимации, что хотите, чтобы она продолжала отображать в переднем ( final) состояние анимации. Между тем, вы на самом деле не установили преобразование на слое, чтобы иметь свойства, которые вы использовали для анимации. Это может привести к тому, что все будет рассинхронизировано.

Теперь проблема, с которой вы столкнетесь, заключается в том, что удаление этих строк приведет к тому, что ваши преобразования вернутся обратно в начальное состояние после завершения анимации. Что вам нужно сделать, так это установить преобразования на слое, чтобы они сохраняли свою позицию после завершения анимации.

Другой вариант - оставить две строки внутри, а затем явно удалить анимацию со слоя вместо установки рамки слоя, как вы упомянули, когда вы будете готовы вернуться к исходному состоянию. Вы делаете это с помощью:

[theView.layer removeAnimationForKey:@"MyAnimation"];

Свойство -removedOnCompletion сообщает слою не удалять анимацию по завершении. Теперь вы можете явно удалить его, и он должен вернуться.

HTH.

2
ответ дан 2 September 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: