web-dev-qa-db-ja.com

モーダルを閉じる方法VCフェードアウトアニメーション付き?

私の提示VCで次のコードを使用して、子モーダルVCをフェードインします。これは正常に機能します。

self.infoViewController.view.alpha = 0.0;
[self.navigationController presentModalViewController:self.infoViewController animated:NO];
[UIView animateWithDuration:0.5
             animations:^{self.infoViewController.view.alpha = 1.0;}];

しかし、フェードアウトすることができません。いくつか試してみましたが、これは試してみた最新のものでは機能しません。

- (IBAction)dismissAction:(id)sender
{
if ([[self parentViewController] respondsToSelector:@selector(dismissModalViewControllerAnimated:)])
{
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
    self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    self.parentViewController.view.alpha = 0.0;
    [UIView animateWithDuration:0.5
                     animations:^{self.parentViewController.view.alpha  = 1.0;}];
} else 
{
    [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
    self.presentedViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    self.presentedViewController.view.alpha = 0.0;
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.presentedViewController.view.alpha  = 1.0;}];
}

}

モーダルビューコントローラーはフェードアウトしますが、すぐに表示されます。

16
Gruntcakes

これ(元の部分)は、H2CO3の正しい答えを奪うものではありません。 UIModalTransitionStyleCrossDissolveは、求めている効果をかなり正確に実行します。遅くなるまでmodalTransitionStyleを設定しないだけです。それぞれの位置で、すべてのコードをこれらの関数に置き換えます。

-(void)show{
    self.infoViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:self.infoViewController animated:YES];
}
- (IBAction)dismissAction:(id)sender{
    [self dismissModalViewControllerAnimated:YES];
}

タイミングが問題であることに応じて編集:問題のあるコードについて話しましょう。それは本質的に他のものと同一であるため、私たちは真の場合にのみ焦点を当てます。

[[self parentViewController] dismissModalViewControllerAnimated:YES];
self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
self.parentViewController.view.alpha = 0.0;
[UIView animateWithDuration:0.5
                 animations:^{self.parentViewController.view.alpha  = 1.0;}];

あなたが相互のアニメーションを探しているなら、これはそうではありません。元のアニメーションでは、次のビューのアルファを0に設定してから、次のビューコントローラを表示し、そのビューのアルファを1に設定しました。したがって、論理的には、アニメーションの後にビューコントローラを閉じる必要があります。これはブロックを使用して本当に簡単です。コードは次のようになります。

[UIView animateWithDuration:0.5 animations:^{
    self.view.alpha = 0;
} completion:^(BOOL b){
    [self.presentingViewController dismissModalViewControllerAnimated:NO];
    self.view.alpha = 1;
}];

このコード行は、ビューのアルファを0にアニメーション化し、次に(完了時に)表示されたビューコントローラーを閉じ、ビューのアルファを1に戻します。これは相反するアニメーションです。

50
NJones

UIViewControllerのドキュメントでは、以下を見つけることができます。

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle

このプロパティをUIModalTransitionStyleCrossDissolveに設定すると、適切に溶解します:)

お役に立てば幸いです。

10
user529758

これは、アプリの主要なモードとは異なり、フルスクリーンモードで向きを付けてMPMoviePlayerViewControllerを使用しようとする英雄的な人には役立つかもしれません。

私は文字通りMPMoviePlayerViewControllerをモーダルに、またはモーダルにせずに、1日の半分の作業で費やしてきました。しかし、トランジションアニメーションが変化するという意味で、これにはまったく運がありません。 (アプリの主な向きとは異なる向きの設定に必要なモーダルモード)。

PresentViewControllerまたはpresentModalViewControllerを試しましたが、結果は同じです。 modalTransitionStyleプロパティセットのタイプに関係なく、[... dismissViewControllerAnimated:true ...]を実行すると、いずれにしてもデフォルトの遷移スタイル(UIModalTransitionStyleCoverVertical)が使用されます。 iOS 5.1デバイスとiOS 6シミュレータでテストしました。

他のタイプのコントローラーを試したことはありません...共通コントローラーにはメソッドdismissMoviePlayerViewControllerAnimatedがあることを考えると、このメソッドは、どのように表示されても、ビデオコントローラーを閉じるためにとにかく使用されていると想定できます。 (トランジションの入力は、CoverVerticalとして処理されなかったことを除いて、私にとっても機能しませんでした(modalTransitionStyleが変更された場合)。

したがって、私の解決策は遷移アニメーションをまったく使用しないでした。確かに、AppleにはMovieViewControllerに特定のアニメーションのみを許可する理由がありました(私は本当にそう願っていますが、それは「怠惰」のためではありませんでした)。ユーザーが取得する、彼らは失敗しました。私のアプリのように、ビデオがアニメーションなしで表示される場合はさらに優れています(CrossDisolvingよりも確実に悪い)が、それは通常のCoverVerticalよりは優れています。

これを開発者の観点から見ると、開発者のより快適で効果的な作業ではなく、デザイナーに顧客のためにニースアイコンをペイントするために、はるかに多くのお金を費やすように思えます。 (

0
Agat