如何在视图控制器之间进行淡入淡出/无过渡

Sjo*_*ors 58 objective-c ios uistoryboardsegue

是否可以在Storyboard中的视图控制器之间进行淡入和淡出过渡.或者没有过渡.

如果有可能,它的代码是什么?

Rob*_*Rob 139

如果呈现一个模式视图控制器,你可以指定modalTransitionStyleUIModalTransitionStyleCrossDissolve.如果在故事板中使用segue执行此操作,请选择segue的属性检查器,并在其中指定过渡样式:

在此输入图像描述

如果以编程方式显示视图控制器,则可以使用"Cross Dissolve"的"Transition"在故事板中的视图控制器之间定义模态segue,然后让源视图控制器执行此segue:

[self performSegueWithIdentifier:@"presentSegue" sender:sender];
Run Code Online (Sandbox Code Playgroud)

或者,如果你打电话presentViewController:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"YourStoryboardID"];
controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:controller animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

在iOS 7中,Apple提供了一项新技术,可为高度自定义的过渡提供丰富而强大的控制.有关更多信息,请参阅使用View Controllers的 WWDC 2013视频自定义转换.

但是,例如,如果要在iOS 7中自定义推送和弹出动画以淡出,则应delegate为导航控制器指定a

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationController.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

然后animationControllerForOperation,您将实现指定的animator对象以进行推送和弹出:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

您显然必须实现自定义推送和弹出动画制作工具,例如:

@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
Run Code Online (Sandbox Code Playgroud)

@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
Run Code Online (Sandbox Code Playgroud)

有一种类似但略有不同的技术可用于自定义模态转换(尽管如果你只是做一张脸,你可能只是使用modalTransitionStyle上面讨论过的,除非你想要使用其他一些微妙的自定义).有关详细信息,请参阅上述使用视图控制器的自定义过渡.

最重要的是,iOS 7的自定义转换是一种稍微复杂但非常强大的方式,可以对转换动画提供巨大的控制.

  • 感谢您制作如此完整且可复制/粘贴的答案! (5认同)

Yar*_*nko 16

用于创建自定义分段创建UIStoryboard segue的子类.例如:

// 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
Run Code Online (Sandbox Code Playgroud)

然后在MainStoryboard.storyboard中选择segue并设置Style:Custom和Class:MCFadeSegue.


Eug*_*ets 8

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

}
Run Code Online (Sandbox Code Playgroud)


小智 6

无需创建自定义segue,我将此代码放在一起以呈现视图...

UIViewController *nextView = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"YOUR_VIEW_CONTROLLER_STORYBOARD_NAME"];

nextView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

[self.navigationController presentViewController:nextView animated:YES completion:nil];
// (For a cross dissolve, set animated:YES.  For no transition, set animated:NO.)

希望这可以帮助任何遇到这个问题的人!


S R*_*yak 5

试试这个吧.

    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)
Run Code Online (Sandbox Code Playgroud)