IT TIP

뷰 컨트롤러간에 페이드 / 전환 없음을 어떻게 수행합니까?

itqueen 2020. 12. 9. 22:06
반응형

뷰 컨트롤러간에 페이드 / 전환 없음을 어떻게 수행합니까?


스토리 보드의 뷰 컨트롤러간에 페이드 인 및 페이드 아웃 전환을 수행 할 수 있습니까? 또는 전환없이.

가능하다면 코드는 무엇입니까?


모달 뷰 컨트롤러를 제공하는 경우 modalTransitionStyleof를 지정할 수 있습니다 UIModalTransitionStyleCrossDissolve. 스토리 보드에서 segue로이 작업을 수행하는 경우 segue에 대한 속성 관리자를 선택하고 전환 스타일을 지정합니다.

여기에 이미지 설명 입력

뷰 컨트롤러를 프로그래밍 방식으로 제공하는 경우 스토리 보드의 뷰 컨트롤러간에 "Transition"이 "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 비디오 View Controller를 사용한 사용자 지정 전환을 참조하십시오 .

그러나 예를 들어 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의 사용자 지정 전환은 약간 복잡하지만 전환을위한 애니메이션을 엄청나게 제어 할 수있는 매우 강력한 방법입니다.


Custom 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를 설정합니다.


푸시 / 팝 UIVIewController 스위프트의 페이드 인 / 페이드 아웃

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

}

사용자 지정 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.)

Hope this helps anyone who comes across this question!


Try this one.

    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)

My Swift Version with optional checking 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)
    }

Just make sure to set the Storyboard ID of the "View controller" in IB


내가 한 일은 Interface Builder에서 Storyboard를 사용하고 /에서 /에서 뒤로 이동 해야하는 두 개의 뷰 컨트롤러를 연결하고 (Ctrl을 누른 상태에서 원본 뷰 컨트롤러에서 대상 뷰 컨트롤러로 드래그 클릭) segue 속성을 변경했습니다. 다음을 사용했습니다.

여기에 이미지 설명 입력

그런 다음 다음을 사용했습니다.

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

제거하려면 원본 뷰 컨트롤러에서 다음을 호출하십시오.

[self dismissViewControllerAnimated:YES completion:nil];

간단하고 매우 빠릅니다.


푸시 / 팝 UIVIewController FadeIn / FadeOut in Swift 3 syntax, based on 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)
    }

}

참고 URL : https://stackoverflow.com/questions/10961926/how-do-i-do-a-fade-no-transition-between-view-controllers

반응형