web-dev-qa-db-ja.com

removeFromSuperviewのアニメーション

サブビューからスーパービューへの遷移をアニメーション化したいと思います。

以下を使用してサブビューを表示します。

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

削除されたときにサブビューをアニメーション化するために私がしなければならない別のことはありますか?

37
user230949

私はあなたがする必要があると思いますforView:self.view.superview代わりに、この場合self.viewは子なので、親で行う必要があります。

28
newacct

IOS 4.0以上をターゲットにしている場合は、代わりにアニメーションブロックを使用できます。

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

(上記のコードは AppleのUIViewドキュメント からのものです)

109
JosephH

ジョセフはスウィフトで答えます:

UIView.animateWithDuration(0.2, animations: {view.alpha = 0.0}, 
                                completion: {(value: Bool) in
                                              view.removeFromSuperview()
                                            })
19
Tal Haham

アニメーション完了ブロックから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];
                 }];
3
nalexn

以下の例:

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()
    }
}
0
De Zheng