Анимация removeFromSuperview
Я хотел бы оживить переход от подзона к супер-представлению.
Я показываю subview, используя:
[UIView beginAnimations:@"curlup" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:.5];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
[self.view addSubview:self.mysubview.view];
[UIView commitAnimations];
Вышеописанное работает отлично. Возвращаясь к супер-представлению, я не получаю анимацию:
[UIView beginAnimations:@"curldown" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:.5];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
[self.view removeFromSuperview];
[UIView commitAnimations];
Есть ли что-то другое, что я должен делать, чтобы подзаголовок анимации при удалении?
Ответы
Ответ 1
Я думаю, вам нужно сделать forView:self.view.superview
вместо того, чтобы соответствовать тому, что вы делаете, когда добавляете, потому что в этом случае self.view
является дочерним, и поэтому вам нужно будет сделать это на родительском.
Ответ 2
Если вы ориентируетесь на iOS 4.0 и выше, вы можете использовать вместо этого блоки анимации:
[UIView animateWithDuration:0.2
animations:^{view.alpha = 0.0;}
completion:^(BOOL finished){ [view removeFromSuperview]; }];
(приведенный выше код взят из документации Apple UIView)
Ответ 3
Ответ Джозефа в Свифте:
UIView.animateWithDuration(0.2, animations: {view.alpha = 0.0},
completion: {(value: Bool) in
view.removeFromSuperview()
})
Ответ 4
Хотя подход с отправкой сообщения removeFromSuperview
из блока завершения анимации отлично работает в большинстве случаев, иногда нет возможности предотвратить немедленное удаление представления из иерархии представлений.
Например, MKMapView
удаляет свои дочерние объекты после получения сообщения removeAnnotations
, и для этого сообщения в API нет "анимированной" альтернативы.
Тем не менее следующий код позволяет вам делать все, что угодно, с визуальным клоном представления после его удаления из супервизора или даже освобожденного:
UIView * snapshotView = [view snapshotViewAfterScreenUpdates:NO];
snapshotView.frame = view.frame;
[[view superview] insertSubview:snapshotView aboveSubview:view];
// Calling API function that implicitly triggers removeFromSuperview for view
[mapView removeAnnotation: annotation];
// Safely animate snapshotView and release it when animation is finished
[UIView animateWithDuration:1.0
snapshotView.alpha = 0.0;
}
completion:^(BOOL finished) {
[snapshotView removeFromSuperview];
}];
Ответ 5
Пример ниже:
func removeSpinningGear(cell: LocalSongsCollectionViewCell) {
UIView.animate(withDuration: 1.0, delay: 0.0, options: UIView.AnimationOptions.curveLinear, animations: {
cell.spinningGearBtn.alpha = 0.0
}) { _ in
cell.spinningGearBtn.removeFromSuperview()
}
}