2012-06-09 3 views

ответ

136

Если вы представляете контроллер модального вида, вы можете указать 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]; 

В прошивке 7, Apple предоставила новую технологию, которая обеспечивает богатый и надежный контроль за высоко настроенные переходы. Для получения дополнительной информации см. Видео WWDC 2013 Custom Transitions Using View Controllers.

Но, например, если вы хотите настроить толчок и поп-анимацию в прошивке 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 обсуждался выше, если есть была какая-то другая тонкая настройка, которую вы хотели использовать). См. Вышеупомянутый Custom Transitions Using View Controllers для получения дополнительной информации.

Нижняя линия, пользовательские переходы для iOS 7 - это несколько сложный, но очень надежный способ обеспечить огромный контроль над анимациями для переходов.

+5

Благодарим вас за составление полного и скопированного/вставного ответа! – xaphod

16

Для создания пользовательского 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 и набор Стиль: Выборочная и класс: MCFadeSegue.

+0

должно быть @ реализация MCFadeSegue не @ реализация MCFadeInSegue же как .h –

+0

@ brian.clear Исправлено. Благодарю. –

5

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

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

6

Тяни/Поп 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

My 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

2

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

enter image description here

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

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

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

[self dismissViewControllerAnimated:YES completion:nil]; 

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

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

Тяни/Поп UIViewController FadeIn/FadeOut в Swift 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) 
    } 

}