У меня есть проблема, которую я не понимаю относительно UIViews и Базовой Анимации. Вот то, что я хочу сделать:
В первый раз, когда я представляю, минимизировать-и-перемещать и удаляю представление, все хорошо работает. Но когда я представляю представление снова, оно отображается в измененном положении (даже при том, что оно, как предполагается, установлено в исходном положении вызовом к 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"];
Как вернуть слой к представлению после анимации?
Что произойдет, если вы удалите эти две строки?
group.fillMode = kCAFillModeForwards;
group.removedOnCompletion = NO;
С помощью этих строк вы сообщаете основной анимации, что хотите, чтобы она продолжала отображать в переднем ( final) состояние анимации. Между тем, вы на самом деле не установили преобразование на слое, чтобы иметь свойства, которые вы использовали для анимации. Это может привести к тому, что все будет рассинхронизировано.
Теперь проблема, с которой вы столкнетесь, заключается в том, что удаление этих строк приведет к тому, что ваши преобразования вернутся обратно в начальное состояние после завершения анимации. Что вам нужно сделать, так это установить преобразования на слое, чтобы они сохраняли свою позицию после завершения анимации.
Другой вариант - оставить две строки внутри, а затем явно удалить анимацию со слоя вместо установки рамки слоя, как вы упомянули, когда вы будете готовы вернуться к исходному состоянию. Вы делаете это с помощью:
[theView.layer removeAnimationForKey:@"MyAnimation"];
Свойство -removedOnCompletion сообщает слою не удалять анимацию по завершении. Теперь вы можете явно удалить его, и он должен вернуться.
HTH.