Подтвердить что ты не робот

Как сделать переход Fade/No между контроллерами представления

Можно ли затухать и исчезать переход между View Controllers в Storyboard. Или без перехода.

Если это возможно, какой код для него?

4b9b3361

Ответ 1

Если вы представляете контроллер модального представления, вы можете указать modalTransitionStyle UIModalTransitionStyleCrossDissolve. Если вы сделаете это с помощью segue в своем раскадровке, выберите инспектор атрибутов для segue и укажите там стиль перехода:

enter image description here

Если вы представляете программный контроллер представления, вы можете определить свой модальный сегмент между контроллерами вида в вашем раскадровке с помощью "Переход" "Cross Dissolve", а затем, чтобы контроллер представления исходного кода выполнил этот этап:

[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 Пользовательские переходы с использованием контроллеров просмотра.

Но, например, если вы хотите настроить анимацию push и pop в 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;
}

Вам, очевидно, придется реализовать свои пользовательские аниматоры push и pop, такие как:

@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 - это немного сложный, но очень надежный способ обеспечить огромный контроль над анимациями для переходов.

Ответ 2

Для создания пользовательского Segue создайте подкласс 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

Затем в MainStoryboard.storyboard выберите segue и установите Style: Custom и Class: MCFadeSegue.

Ответ 3

Push/Pop UIVIewController FadeIn/FadeOut в Swift

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

}

Ответ 4

Без создания пользовательского 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.)

Надеюсь, это поможет любому, кто сталкивается с этим вопросом!

Ответ 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)

Ответ 6

Моя версия Swift с дополнительной проверкой offcourse!

    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

Ответ 7

То, что я сделал, это использовать Storyboard в Interface Builder, подключив два контроллера просмотра, которые вам нужно переместить в/из и обратно (удерживайте ctrl и перетащите клик с исходного контроллера представления в конечный диспетчер представлений) и измените свойства segue. Я использовал следующее:

введите описание изображения здесь

Затем я использовал следующее:

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

когда вы хотите удалить его, просто вызовите это из источника viewController:

[self dismissViewControllerAnimated:YES completion:nil];

Просто и очень быстро.

Ответ 8

Push/Pop UIVIewController FadeIn/FadeOut в синтаксисе Swift 3, основанном на Евгении Брагинесе ответить

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

}