私がすることはこれです:
すべてのView Controllerのすべてに、コードにアウトレットを持たせます。VC を閉じるときは、これらすべてをアニメートしてアルファ 0 にします。次に、新しい VC をプッシュします。すべてのアイテムのアルファは 0 で始まり、アニメートして 1 に戻します。 VC がアニメーション化されていない場合、背景画像は変化せず、一貫した背景を維持しながら、最後の画面がフェードアウトし、新しい画面がフェードインするように見えます。
それはあなたが探しているものですか?
より具体的な例を次に示します。
VC1 と VC2 の 2 つのビュー コントローラーがあるとします。VC1 にはフレームの中央に大きなボタン (button1) があり、これを押すと VC2 が起動します。VC2 には、VC1 に戻るための戻るボタン (button2) しかありません。
まず Interface Builder で、ビューの背景画像を VC1 と VC2 の両方で同じ画像に設定します。次に、各 VC にボタンを追加し、それらをヘッダーの適切なアウトレットに接続して、.m ファイルのプロパティを合成します。インターフェイス ビルダーで、各ボタンのアルファをゼロに設定します。それは消えますが、まだそこにあり、目に見えないだけです。
また、ユーザーが各ボタンを押したときのメソッドも作成します。これを VC1 では firstButton、VC2 では backButton と呼びます。これらをボタン 1 とボタン 2 に接続します。
別の方法でコーディングするまで、ボタンは表示されません。そのため、アプリが読み込まれ、画面に VC1 が表示されたら、次のようにボタンの不透明度をアニメーション化する必要があります。アニメーションの構文に慣れていなくても心配はいりません。とても簡単です。
- (void) viewDidAppear:(BOOL)animated {
// Animations
[UIView animateWithDuration:0.2 // How long the animation takes
delay:0 // Any once we hit this line of code before the animation takes place
options:UIViewAnimationCurveEaseInOut // Play around with this one to see what style of animation you want
animations:^{ // This is where we actually say what we want to animate. Make sure you use block syntax like I have here.
self.button1.alpha = 1;
}
completion:^ (BOOL finished){} // If you want to do something else after the animations are complete you can call that here.
];
}
以上です!これは、viewDidLoad や viewWillAppear ではなく、viewDidAppear メソッドで行っていることに注意してください。これらは、画面に何かが表示される前に発生し、その時点ではアニメーションを実行できないためです。
ユーザーが VC1 のボタンをタップすると、不透明度をアニメートしてゼロに戻し、VC2 をスタックにプッシュする必要があります。これは前回のアニメーションとほぼ同じですが、今回は完了ブロックで VC2 に変更する必要があります。animation:NO 呼び出しでこれを行うと、最初のビューがスライドアウトすることはありません。背景画像が同じなので、同じ VC にいるように見えます。
- (void) firstButton {
VC2 *secondVC = [[VC2 alloc] initWithNibName:@"VC2"];
[UIView animateWithDuration:0.2
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
self.button1.alpha = 0;
}
completion:^ (BOOL finished){ // Presenting the instance of VC2
[self.navigationController pushViewController:secondVC animated:NO];
}
];
}
これで、VC1 のすべてのアニメーションが完成しました。フェードイン効果を VC2 の viewDidAppear メソッド (再度コピーするつもりはありませんが、文字通り同じです) にコピーし、コードを backButton メソッドにコピーする必要があります。これは firstButton メソッドとほぼ同じです。ただし、新しいビュー コントローラーをプッシュするのではなく、ビュー コントローラーをポップする点が異なります。
- (void) backButton {
[UIView animateWithDuration:0.2
delay:0
options:UIViewAnimationCurveEaseInOut
animations:^{
self.button2.alpha = 0;
}
completion:^ (BOOL finished){ // Removing the instance of VC2
[self.navigationController popViewControllerAnimated:NO];
}
];
}
それは物事を明確にしますか?