Можно ли затухать и исчезать переход между View Controllers в Storyboard. Или без перехода.
Если это возможно, какой код для него?
Можно ли затухать и исчезать переход между View Controllers в Storyboard. Или без перехода.
Если это возможно, какой код для него?
Если вы представляете контроллер модального представления, вы можете указать modalTransitionStyle
UIModalTransitionStyleCrossDissolve
. Если вы сделаете это с помощью segue в своем раскадровке, выберите инспектор атрибутов для segue и укажите там стиль перехода:
Если вы представляете программный контроллер представления, вы можете определить свой модальный сегмент между контроллерами вида в вашем раскадровке с помощью "Переход" "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 - это немного сложный, но очень надежный способ обеспечить огромный контроль над анимациями для переходов.
Для создания пользовательского 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.
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)
}
}
}
Без создания пользовательского 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.)
Надеюсь, это поможет любому, кто сталкивается с этим вопросом!
Попробуйте это.
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)
Моя версия 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
То, что я сделал, это использовать Storyboard в Interface Builder, подключив два контроллера просмотра, которые вам нужно переместить в/из и обратно (удерживайте ctrl и перетащите клик с исходного контроллера представления в конечный диспетчер представлений) и измените свойства segue. Я использовал следующее:
Затем я использовал следующее:
[self performSegueWithIdentifier:@"showMovieDetailSegue" sender:self];
когда вы хотите удалить его, просто вызовите это из источника viewController:
[self dismissViewControllerAnimated:YES completion:nil];
Просто и очень быстро.
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)
}
}