web-dev-qa-db-ja.com

ビューコントローラー間でフェード/ノートランジションを行う方法

StoryboardのView Controller間でフェードインとフェードアウトの切り替えを行うことは可能ですか?または移行なし。

可能であれば、そのコードは何ですか?

58
Sjors

モーダルView Controllerを提示する場合、- modalTransitionStyleUIModalTransitionStyleCrossDissolve を指定できます。ストーリーボードのセグエでこれを行う場合は、セグエの属性インスペクターを選択し、そこでトランジションスタイルを指定します。

enter image description here

View Controllerをプログラムで表示する場合、「Cross Dissolve」の「Transition」でストーリーボードのView Controller間のモーダルセグエを定義し、ソースView Controllerにこのセグエを実行させることができます。

[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ビデオを参照してください View Controllersを使用したカスタムトランジション

ただし、たとえば、iOS 7のプッシュアニメーションとポップアニメーションをフェードするようにカスタマイズする場合は、Navigation Controllerに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を使用するでしょう雇用)。詳細については、前述の View Controllerを使用したカスタムトランジション を参照してください。

結論として、iOS 7のカスタムトランジションは少し複雑ですが、トランジションのアニメーションを非常に強力に制御する方法です。

139
Rob

カスタムセグエを作成するには、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でセグエを選択し、Style:CustomおよびClass:MCFadeSegueを設定します。

16

Swiftのプッシュ/ポップUIVIewController FadeIn/FadeOut

class FadeInPushSegue: UIStoryboardSegue {

    var animated: Bool = true

    override func perform() {

        if var sourceViewController = self.sourceViewController as? UIViewController, var destinationViewController = self.destinationViewController as? UIViewController {

            var transition: CATransition = CATransition()

            transition.type = kCATransitionFade; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade
            sourceViewController.view.window?.layer.addAnimation(transition, forKey: "kCATransition")
            sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false)


        }
    }

}

class FadeOutPopSegue: UIStoryboardSegue {

    override func perform() {

        if var sourceViewController = self.sourceViewController as? UIViewController, var destinationViewController = self.destinationViewController as? UIViewController {

            var transition: CATransition = CATransition()

            transition.duration = 0.4
            transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            transition.type = kCATransitionFade; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade

            sourceViewController.view.window?.layer.addAnimation(transition, forKey: "kCATransition")
            sourceViewController.navigationController?.popViewControllerAnimated(false)
        }
    }

}
8

カスタムセグエを作成する必要なく、このコードをまとめてビューを表示します...

 UIViewController * nextView = [[UIStoryboard storyboardWithName:@ "Main" bundle:nil] instantiateViewControllerWithIdentifier:@ "YOUR_VIEW_CONTROLLER_STORYBOARD_NAME"]; 
 
 nextView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [._ ] 
 [self.navigationController presentViewController:nextView animated:YES completion:nil]; 
 //(クロスディゾルブの場合、animated:YESを設定します。トランジションなしの場合、animated:NOを設定します。)

これがこの質問に出くわしたすべての人を助けることを願っています!

6
Brandon Roberts

これを試してください。

    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)
5
S R Nayak

My Swiftオプションのチェックオフコース付きバージョン!

    let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
    if let stView = storyboard.instantiateViewControllerWithIdentifier("STVC") as? STVC {
        stView.modalTransitionStyle = UIModalTransitionStyle.CrossDissolve
        self.navigationController?.presentViewController(stView, animated: true, completion: nil)
    }

IBの「View controller」のStoryboard IDを必ず設定してください。

4
ioopl

私がやったのは、Interface BuilderでStoryboardを使用し、移動する必要のある2つのViewControllerを前後に接続し(ctrlを押しながらOrigin ViewControllerから目的のViewControllerにドラッグクリック)、セグエプロパティを変更しました。私は次を使用しました:

enter image description here

次に、以下を使用しました。

[self performSegueWithIdentifier:@"showMovieDetailSegue" sender:self];

削除したい場合は、Origin viewcontrollerからこれを呼び出すだけです:

[self dismissViewControllerAnimated:YES completion:nil];

シンプルで非常に迅速。

2
Septronic

プッシュ/ポップUIVIewController FadeIn/FadeOut inSwift 3構文、 Eugene Braginets 's answer =

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)
    }

}
1
Maverick