StoryboardのView Controller間でフェードインとフェードアウトの切り替えを行うことは可能ですか?または移行なし。
可能であれば、そのコードは何ですか?
モーダルView Controllerを提示する場合、- modalTransitionStyle
の UIModalTransitionStyleCrossDissolve
を指定できます。ストーリーボードのセグエでこれを行う場合は、セグエの属性インスペクターを選択し、そこでトランジションスタイルを指定します。
View Controllerをプログラムで表示する場合、「Cross Dissolve」の「Transition」でストーリーボードのView Controller間のモーダルセグエを定義し、ソースView Controllerにこのセグエを実行させることができます。
[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 Controllersを使用したカスタムトランジション 。
ただし、たとえば、iOS 7のプッシュアニメーションとポップアニメーションをフェードするようにカスタマイズする場合は、Navigation Controllerに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
を使用するでしょう雇用)。詳細については、前述の View Controllerを使用したカスタムトランジション を参照してください。
結論として、iOS 7のカスタムトランジションは少し複雑ですが、トランジションのアニメーションを非常に強力に制御する方法です。
カスタムセグエを作成するには、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でセグエを選択し、Style:CustomおよびClass:MCFadeSegueを設定します。
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)
}
}
}
カスタムセグエを作成する必要なく、このコードをまとめてビューを表示します...
UIViewController * nextView = [[UIStoryboard storyboardWithName:@ "Main" bundle:nil] instantiateViewControllerWithIdentifier:@ "YOUR_VIEW_CONTROLLER_STORYBOARD_NAME"]; nextView.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [._ ] [self.navigationController presentViewController:nextView animated:YES completion:nil]; //(クロスディゾルブの場合、animated:YESを設定します。トランジションなしの場合、animated:NOを設定します。)
これがこの質問に出くわしたすべての人を助けることを願っています!
これを試してください。
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オプションのチェックオフコース付きバージョン!
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の「View controller」のStoryboard IDを必ず設定してください。
私がやったのは、Interface BuilderでStoryboardを使用し、移動する必要のある2つのViewControllerを前後に接続し(ctrlを押しながらOrigin ViewControllerから目的のViewControllerにドラッグクリック)、セグエプロパティを変更しました。私は次を使用しました:
次に、以下を使用しました。
[self performSegueWithIdentifier:@"showMovieDetailSegue" sender:self];
削除したい場合は、Origin viewcontrollerからこれを呼び出すだけです:
[self dismissViewControllerAnimated:YES completion:nil];
シンプルで非常に迅速。
プッシュ/ポップUIVIewController FadeIn/FadeOut inSwift 3構文、 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)
}
}