Теперь этот вопрос частично просил много, но никто не рассматривает, как (или когда) отправляются сообщения -viewWillDisappear
& -viewDidDisappear
. Практически в каждом примере используется следующая конструкция:UIView removeFromSuperview внутри анимации PROPERLY
[UIView animateWithDuration:0.5
delay:1.0
options: UIViewAnimationCurveEaseOut
animations:^{
yourView.alpha = 0;
}completion:^(BOOL finished){
[yourView removeFromSuperview]; // Called on complete
}];
Проблема в том, что эти сообщения будут отправляться при завершении анимации! Теперь, -addSubview
можно анимировать (если положить внутри блока анимации), который отправит соответствующие сообщения (-viewWillAppear
& -viewDidAppear
) с правильной временной разницей. Таким образом, естественно, что в блоке анимации будет -removeFromSuperview
. Это ПОЛУЧИТЬ сообщения правильно, но представление фактически удаляется мгновенно, делая анимацию ... Ну, это не будет оживлять, потому что ничего не осталось для анимации!
Является ли это намеренным яблоко, и если да, то почему? Как вы это делаете правильно?
Спасибо!
Редактировать.
Просто clearify, что я делаю: Я получил пользовательский SEGUE, вертикально оживляющий ребенка-ViewController вниз от верхней части, которая работает, как ожидается, со следующим кодом:
-(void)perform{
UIViewController *srcVC = (UIViewController *) self.sourceViewController;
UIViewController *destVC = (UIViewController *) self.destinationViewController;
destVC.view.transform = CGAffineTransformMakeTranslation(0.0f, -destVC.view.frame.size.height);
[srcVC addChildViewController:destVC];
[UIView animateWithDuration:0.5f
animations:^{
destVC.view.transform = CGAffineTransformMakeTranslation(0.0f, 0.0f);
[srcVC.view addSubview:destVC.view];
}
completion:^(BOOL finished){
[destVC didMoveToParentViewController:srcVC];
}];
}
Здесь будет в следующем порядке (благодаря -addSubview
, находясь внутри анимации-блока):
- Добавить childView (автоматически вызывать
-willMoveToParentViewController
) -addSubview
будет вызывать-viewWillAppear
- Когда анимация заканчивается,
-addSubview
будет вызывать-viewDidAppear
- вручную вызвать
-didMoveToParentViewController
внутри заканчивания-блок
выше точное ожидаемое поведение (так же, как встроенные переходы ведут) ,
С помощью следующего кода, чтобы сделать выше SEGUE, но в обратном направлении (с unwindSegue):
-(void)perform{
UIViewController *srcVC = (UIViewController *) self.sourceViewController;
srcVC.view.transform = CGAffineTransformMakeTranslation(0.0f, 0.0f);
[srcVC willMoveToParentViewController:nil];
[UIView animateWithDuration:5.5f
animations:^{
srcVC.view.transform = CGAffineTransformMakeTranslation(0.0f, -srcVC.view.frame.size.height);
}
completion:^(BOOL finished){
[srcVC.view removeFromSuperview]; // This can be done inside the animations-block, but will actually remove the view at the same time ´-viewWillDisappear´ is invoked, making no sense!
[srcVC removeFromParentViewController];
}];
}
поток будет выглядеть следующим образом:
- вручную вызвать
-willMoveToParentView:nil
уведомить, что он будет удалено - Когда анимация закончится, оба
-viewWillDisappear
&-viewDidDisappear
будут вызываться одновременно (неправильно!) и-removeFromParentViewController
будет автоматически lly invoke-didMoveToParentViewController:nil
.
И если я теперь двигаться -removeFromSuperview
в к анимации-блока, события будут отправлены правильно, но вид удаляется, когда анимация начинается вместо того, когда анимация заканчивается (это та часть, которая не имеет никакого смысла, следуя примеру -addSubview
).
Что вы видите, что вы должны ожидать, так как вы удаляете вид мгновенно. В чем проблема с viewWillDisappear и viewDidDisappear, называемым один за другим? Что вы хотите сделать в этих методах, что это проблема? – rdelmar
'yourView' выглядит как объект' UIView', а '-viewWillAppear',' -viewDidAppear', '-viewWillDisappear',' -viewDidDisappear' - это все методы экземпляра 'UIViewController', а не' UIView''s – staticVoidMan
@ rdelmar В моем случае это UnwindSegue, который на '-viewWillDisappear' должен запускать «scrollUp» -анимацию одновременно, чтобы создать приятный эффект. Тем не менее, важно, чтобы сообщения отправлялись, когда вы ожидаете, что они будут работать логически для других кодеров. – helmesjo