Подтвердить что ты не робот

Анимация 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];

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

4b9b3361

Ответ 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()
    }
}