Переход с анимацией слева направо

#ios #xcode #segue #swift3 #uistoryboardsegue

#iOS #xcode #segue #swift3 #uistoryboardsegue

Вопрос:

Я пытаюсь реализовать пользовательский переход, который приведет viewcontroller с анимацией справа налево. Проблема в том, что мое приложение вылетает, когда я нажимаю кнопку, чтобы выполнить переход к нужному контроллеру. Я получаю следующую ошибку:

Не удалось создать переход класса ‘(null)’

Как я это реализовал? Я создал новый класс и переопределил функцию выполнения следующим кодом:

 import UIKit

class CustomTransition: UIStoryboardSegue {

override func perform()
{
    let src = self.source
    let dst = self.destination

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
    dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

    UIView.animate(withDuration: 0.25,
                               delay: 0.0,
                               options: UIViewAnimationOptions.curveEaseInOut,
                               animations: {
                                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
        },
                               completion: { finished in
                                src.present(dst, animated: false, completion: nil)
        }
    )
}
  

}

В моей раскадровке у меня есть UIButtoon, который я привязал с помощью пользовательского перехода (сгенерированного моим классом CustomTransition ). Когда я запускаю приложение и нажимаю на кнопку, мое приложение вылетает с ошибкой, опубликованной выше. Я не могу понять, почему это сбой. Каждая статья в Интернете, которую я нашел, похожа на то, как я ее реализовал.

Ответ №1:

Вы пытались использовать не переходы, а переходы для этой цели?

 // create transition
let transition = CATransition()
transition.duration = 0.3
// check other types
transition.type = kCATransitionMoveIn
// move from left
transition.subtype = kCATransitionFromLeft
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
navigationController.view.layer.addAnimation(transition, forKey: kCATransition)
// push controller
navigationController.pushViewController(controller, animated: false)
  

Комментарии:

1. что такое NavigationController? Должен ли ваш sourceVC быть UINavigationController? Что, если источник и назначение — это всего лишь два обычных UIViewControllers, как в исходном вопросе?

2. @Cindeselia вы можете получить доступ к контроллеру навигации из свойства sourceVC.navigationController .

Ответ №2:

Вы можете извлечь этот код в класс перехода и использовать в раскадровке:

LeftToRightSegue.h:

 @interface LeftToRightSegue : UIStoryboardSegue

@end
  

LeftToRightSegue.m

 @implementation LeftToRightSegue
-(void)perform
{
    CATransition * transition = [CATransition new];
    transition.duration = 1;
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromLeft;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [self.sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition];
    [self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:false];
}
@end