Я пытаюсь сделать анимацию толчка с одной стороны, используя CATransition
.Я делаю это в методе, который обрабатывает два UIViews
, один для фона и другой для переднего плана.Анимированный UIView
будет на переднем плане.Однако я не хочу, чтобы новый контент заменял старый, поэтому для этого я перемещаю весь старый контент с переднего плана на фон UIView
, ожидая, что он просто оживит push-переход UIView
с одной стороны, но вместо этого он заменяет старый UIView
.Есть ли способ сделать то, что я пытаюсь сделать, например, заблокировать состояние UIViews
с того момента, когда передний план и фон UIViews
имеют правильное содержимое?
Мой код - это что-токак это:
UIView *newView = argView; // argView is the view passed as a parameter to the method
// move views from foreground to background
for (UIView *v in [fgView subviews]) {
[v removeFromSuperview];
[bgView addSubview:v];
}
// Slide animation
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[fgView.layer addAnimation:transition forKey:nil];
[fgView addSubview:newView];
[править] Я проводил некоторые исследования.Очевидно (или то, что я думаю, может происходить), это то, что удаление фона UIViews принимает неявную анимацию.Есть ли способ остановить анимацию?
[править] Ответ: Да, это можно сделать (отключив неявную анимацию), и это делается с помощьюследующий код
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
for (UIView *v in [fgView subviews]) {
[v removeFromSuperview];
[bgView addSubview:v];
}
[CATransaction commit];
Это то, что я сделал, и оно должно работать (согласно порталу разработчика Apple), но это не так, поэтому вопрос все еще открыт.
[править] После долгих испытаний и чтения я обнаружил, что проблема в том, что когда я удаляю представление из его суперпредставления, переход или анимация не распознают этоизменить позже, поэтому он реагирует устаревшими из последних изменений.Есть ли способ заставить обновление или проверить, когда removeFromSuperview
или addSubview
закончен?
[edit] Что мне нужно именно это: 1) текущее состояние UIViews: bgView со старыми представлениями за затененным UIView или midView (это представление не должно быть анимированным).MidView, который никогда не анимирован.FgView с текущим UIView.2) Я хочу переместить содержимое fgView в bgView (который не будет анимирован) и анимировать внешний вид нового UIView, который добавляется в fgView (с использованием анимации Slide, Fade in / out или Flip).