ストーリーボードのビュー コントローラー間でフェードインとフェードアウトの遷移を行うことは可能ですか? または遷移なし。
可能であれば、そのコードは何ですか?
ストーリーボードのビュー コントローラー間でフェードインとフェードアウトの遷移を行うことは可能ですか? または遷移なし。
可能であれば、そのコードは何ですか?
モーダル ビュー コントローラーを提示する場合は、modalTransitionStyle
ofを指定できますUIModalTransitionStyleCrossDissolve
。ストーリーボードのセグエでこれを行う場合は、セグエの属性インスペクターを選択し、そこでトランジション スタイルを指定します。
ビュー コントローラーをプログラムで表示する場合は、ストーリーボード内のビュー コントローラー間のモーダル セグエを「クロス ディゾルブ」の「トランジション」で定義し、ソース ビュー コントローラーにこのセグエを実行させることができます。
[self performSegueWithIdentifier:@"presentSegue" sender:sender];
または、あなたが電話している場合presentViewController
:
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"YourStoryboardID"];
controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:controller animated:YES completion:nil];
iOS 7 では、Apple は、高度にカスタマイズされたトランジションのためのリッチで堅牢なコントロールを提供する新しいテクノロジを提供しました。詳細については、WWDC 2013 ビデオビュー コントローラーを使用したカスタム トランジション を参照してください。
ただし、たとえば、iOS 7 のプッシュ アニメーションとポップ アニメーションをフェードするようにカスタマイズする場合はdelegate
、ナビゲーション コントローラーにを指定します。
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.delegate = self;
}
animationControllerForOperation
次に、プッシュおよびポップ用のアニメーター オブジェクトを指定して実装します。
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
if (operation == UINavigationControllerOperationPush)
return [[PushAnimator alloc] init];
if (operation == UINavigationControllerOperationPop)
return [[PopAnimator alloc] init];
return nil;
}
明らかに、次のようなカスタムのプッシュおよびポップ アニメーターを実装する必要があります。
@interface PushAnimator : NSObject <UIViewControllerAnimatedTransitioning>
@end
@implementation PushAnimator
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.5;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[[transitionContext containerView] addSubview:toViewController.view];
toViewController.view.alpha = 0.0;
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
toViewController.view.alpha = 1.0;
} completion:^(BOOL finished) {
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
と
@interface PopAnimator : NSObject <UIViewControllerAnimatedTransitioning>
@end
@implementation PopAnimator
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.5;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
[[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view];
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromViewController.view.alpha = 0.0;
} completion:^(BOOL finished) {
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
モーダル トランジションをカスタマイズするための同様の、しかし少し異なる手法もあります (ただし、顔だけをmodalTransitionStyle
作成する場合は、他の微妙なカスタマイズを使用したい場合を除いて、おそらく上記の方法を使用することになるでしょう)。詳細については、前述のビュー コントローラーを使用したカスタム トランジションを参照してください。
つまり、iOS 7 のカスタム トランジションは少し複雑ですが、トランジションのアニメーションを大幅に制御するための非常に堅牢な方法です。
カスタム セグエを作成するには、UIStoryboard セグエのサブクラスを作成します。例えば:
// MCFadeSegue.h
#import <UIKit/UIKit.h>
@interface MCFadeSegue : UIStoryboardSegue
@end
// MCFadeSegue.m
#import <QuartzCore/QuartzCore.h>
#import "MCFadeSegue.h"
@implementation MCFadeSegue
- (void)perform
{
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionFade;
[[[[[self sourceViewController] view] window] layer] addAnimation:transition
forKey:kCATransitionFade];
[[self sourceViewController]
presentViewController:[self destinationViewController]
animated:NO completion:NULL];
}
@end
次に MainStoryboard.storyboard で segue を選択し、Style:Custom と Class:MCFadeSegue を設定します。
これを試してみてください。
let transition: CATransition = CATransition()
transition.duration = 0.4
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.type = kCATransitionFade
self.navigationController!.view.layer.addAnimation(transition, forKey: nil)
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("vcID") as! My_ViewController
self.navigationController?.pushViewController(vc, animated: false)
カスタム セグエを作成する必要なく、ビューを表示するためにこのコードをまとめました...
UIViewController *nextView = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"YOUR_VIEW_CONTROLLER_STORYBOARD_NAME"]; nextView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [self.navigationController presentViewController:nextView アニメーション:YES 完了:nil]; // (クロス ディゾルブの場合は、animated:YES を設定します。トランジションなしの場合は、animated:NO を設定します。)
これが、この質問に出くわした人に役立つことを願っています!
Eugene Braginetsの回答に基づく、 Swift 3構文でのプッシュ/ポップ UIVIewController FadeIn/FadeOut
class FadeInPushSegue: UIStoryboardSegue {
var animated: Bool = true
override func perform() {
let sourceViewController = self.source
let destinationViewController = self.destination
let transition: CATransition = CATransition()
transition.type = kCATransitionFade; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
sourceViewController.view.window?.layer.add(transition, forKey: "kCATransition")
sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false)
}
}
class FadeOutPopSegue: UIStoryboardSegue {
override func perform() {
let sourceViewController = self.source
let transition: CATransition = CATransition()
transition.duration = 0.4
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.type = kCATransitionFade; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
sourceViewController.view.window?.layer.add(transition, forKey: "kCATransition")
_ = sourceViewController.navigationController?.popViewController(animated: false)
}
}
私がしたことは、Interface Builder で Storyboard を使用し、/from に移動する必要がある 2 つのビューコントローラーを接続し (ctrl を押したまま元のビューコントローラーから目的のビューコントローラーにクリックをドラッグ)、セグエのプロパティを変更することでした。私は以下を使用しました:
次に、以下を使用しました。
[self performSegueWithIdentifier:@"showMovieDetailSegue" sender:self];
削除したい場合は、元のビューコントローラーからこれを呼び出すだけです:
[self dismissViewControllerAnimated:YES completion:nil];
シンプルで非常に速い。