뷰 컨트롤러간에 페이드 / 전환 없음을 어떻게 수행합니까?
스토리 보드의 뷰 컨트롤러간에 페이드 인 및 페이드 아웃 전환을 수행 할 수 있습니까? 또는 전환없이.
가능하다면 코드는 무엇입니까?
모달 뷰 컨트롤러를 제공하는 경우 modalTransitionStyle
of를 지정할 수 있습니다 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)
}
}
'IT TIP' 카테고리의 다른 글
라이브러리를 포함하려고하지만 '정의되지 않은 참조'메시지가 계속 표시됩니다. (0) | 2020.12.09 |
---|---|
SAX 파서를 사용하여 XML을 구문 분석하는 방법 (0) | 2020.12.09 |
Intellij 14 이상한 편집기 / 커서 동작 (0) | 2020.12.09 |
하위 폴더에서 루트 폴더의 이미지 선택 (0) | 2020.12.09 |
교차하는 디스크 수를 계산하는 알고리즘 (0) | 2020.12.09 |