UIView отображается неправильно после того, как его слой был анимирован - PullRequest
1 голос
/ 21 июня 2010

У меня проблема, которую я не понимаю в отношении UIViews и Core Animation. Вот что я хочу сделать:

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

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

Что-то вроде 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 Ответ

2 голосов
/ 22 июня 2010

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

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

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

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

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

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

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

HTH.

...