63

ストーリーボードのビュー コントローラー間でフェードインとフェードアウトの遷移を行うことは可能ですか? または遷移なし。

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

4

11 に答える 11

145

モーダル ビュー コントローラーを提示する場合は、modalTransitionStyleofを指定できます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 のカスタム トランジションは少し複雑ですが、トランジションのアニメーションを大幅に制御するための非常に堅牢な方法です。

于 2012-06-10T14:40:45.947 に答える
16

カスタム セグエを作成するには、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 を設定します。

于 2013-05-15T16:34:58.747 に答える
8

これを試してみてください。

    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)
于 2016-03-30T06:17:51.530 に答える
6

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

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 を設定します。)

これが、この質問に出くわした人に役立つことを願っています!

于 2014-02-10T02:38:22.020 に答える
3

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

}
于 2017-01-11T06:33:49.737 に答える
2

私がしたことは、Interface Builder で Storyboard を使用し、/from に移動する必要がある 2 つのビューコントローラーを接続し (ctrl を押したまま元のビューコントローラーから目的のビューコントローラーにクリックをドラッグ)、セグエのプロパティを変更することでした。私は以下を使用しました:

ここに画像の説明を入力

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

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

削除したい場合は、元のビューコントローラーからこれを呼び出すだけです:

[self dismissViewControllerAnimated:YES completion:nil];

シンプルで非常に速い。

于 2016-03-27T02:37:11.157 に答える