サブビューからスーパービューへの遷移をアニメーション化したいと思います。
以下を使用してサブビューを表示します。
[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];
削除されたときにサブビューをアニメーション化するために私がしなければならない別のことはありますか?
私はあなたがする必要があると思いますforView:self.view.superview
代わりに、この場合self.view
は子なので、親で行う必要があります。
IOS 4.0以上をターゲットにしている場合は、代わりにアニメーションブロックを使用できます。
[UIView animateWithDuration:0.2
animations:^{view.alpha = 0.0;}
completion:^(BOOL finished){ [view removeFromSuperview]; }];
(上記のコードは AppleのUIViewドキュメント からのものです)
ジョセフはスウィフトで答えます:
UIView.animateWithDuration(0.2, animations: {view.alpha = 0.0},
completion: {(value: Bool) in
view.removeFromSuperview()
})
アニメーション完了ブロックから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];
}];
以下の例:
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()
}
}