Анимация removeFromSuperview - PullRequest
       12

Анимация removeFromSuperview

35 голосов
/ 05 января 2010

Я бы хотел оживить переход от подпредставления обратно к суперпредставлению.

Я отображаю подпредставление, используя:

[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];

Есть ли что-то другое, что я должен сделать, чтобы убрать подпредставление для анимации?

Ответы [ 5 ]

109 голосов
/ 28 апреля 2011

Если вы ориентируетесь на iOS 4.0 и выше, вы можете использовать вместо этого блоки анимации:

[UIView animateWithDuration:0.2
     animations:^{view.alpha = 0.0;}
     completion:^(BOOL finished){ [view removeFromSuperview]; }];

(приведенный выше код взят из документации Apple по UIView )

27 голосов
/ 05 января 2010

Я думаю, вам нужно вместо этого сделать forView:self.view.superview, чтобы соответствовать тому, что вы делаете, когда добавляете, потому что в этом случае self.view является дочерним, и поэтому вам нужно будет сделать это на родительском элементе. .

13 голосов
/ 03 июня 2015

ДжозефH ответ в Свифте:

UIView.animateWithDuration(0.2, animations: {view.alpha = 0.0}, 
                                completion: {(value: Bool) in
                                              view.removeFromSuperview()
                                            })
3 голосов
/ 14 февраля 2015

Хотя подход с отправкой 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];
                 }];
0 голосов
/ 05 апреля 2019

Пример ниже:

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()
    }
}
...