Как плавно открыть новое окно?

Чтобы плавно открыть новое окно в iOS, вам потребуется использовать анимацию перехода между окнами. Существует несколько способов достичь этого, и я расскажу о двух наиболее распространенных подходах: использование UINavigationController и использование UIViewControllerAnimatedTransitioning.

1) Использование UINavigationController:
Этот подход основан на использовании стандартного класса UINavigationController. Для открытия нового окна со стандартной анимацией можно использовать метод pushViewController:animated:. Вот пример кода:

   let viewController = NewViewController() // Создаем экземпляр нового контроллера
   navigationController?.pushViewController(viewController, animated: true)

Этот код откроет новое окно с плавным переходом, который можно настроить в настройках UINavigationController. Например, вы можете настроить тип анимации перехода с помощью свойства navigationController?.modalTransitionStyle.

2) Использование UIViewControllerAnimatedTransitioning:
Если вам нужна более гибкая анимация перехода между окнами, можно воспользоваться протоколом UIViewControllerAnimatedTransitioning. Сначала вам нужно создать свою анимацию, наследуясь от NSObject и реализовать протокол UIViewControllerAnimatedTransitioning. Вот пример кода:

   class CustomTransition: NSObject, UIViewControllerAnimatedTransitioning {
       func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
           return 0.5 // Длительность анимации
       }
       
       func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
           guard let toView = transitionContext.view(forKey: .to) else { return }
           let containerView = transitionContext.containerView
           
           toView.alpha = 0
           containerView.addSubview(toView)
           
           UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
               toView.alpha = 1
           }, completion: { _ in
               transitionContext.completeTransition(true)
           })
       }
   }

Затем, чтобы использовать эту анимацию для открытия нового окна, вам нужно установить собственный класс анимации для ключей UINavigationControllerDelegate. Вот пример кода:

   let viewController = NewViewController() // Создаем экземпляр нового контроллера
   viewController.transitioningDelegate = self
   present(viewController, animated: true, completion: nil)
   
   extension CurrentViewController: UIViewControllerTransitioningDelegate {
       func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
           return CustomTransition() // Возвращает экземпляр анимации
       }
   }

Этот код откроет новое окно с плавной анимацией, заданной в классе CustomTransition.

Оба подхода предоставляют возможность плавно открывать новое окно в iOS. Выбор подхода зависит от ваших потребностей и требований вашего проекта.