Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : iOS, UIViewController, custom transition, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning

Как реализовать кастомную презентацию viewController без использования стандартного present?

Вопрос проверяет понимание механизмов навигации и представления контроллеров в iOS, а также умение создавать кастомные переходы для улучшения UX.

Короткий ответ

Для кастомной презентации viewController без стандартного present нужно создать объект, управляющий переходом. Сначала назначаем transitioningDelegate у презентуемого контроллера. Этот делегат должен реализовать протокол UIViewControllerTransitioningDelegate и вернуть объект, отвечающий за анимацию. Этот объект реализует протокол UIViewControllerAnimatedTransitioning, в котором описывается логика анимации появления и исчезновения. Затем вызываем метод present, но система использует вашу кастомную анимацию вместо стандартной.

Длинный ответ

Стандартный метод present(_:animated:completion:) в iOS использует системные анимации (например, всплытие снизу). Для создания уникального визуального перехода между экранами, например, плавного появления из центра или разворота, необходимо реализовать кастомную презентацию. Это позволяет полностью контролировать процесс анимации, её длительность и конечное состояние представления.

Ключевые компоненты

Процесс строится на двух основных протоколах:

  • UIViewControllerTransitioningDelegate: Этот делегат предоставляет системе объекты, отвечающие за анимацию и интерактивность перехода. Он назначается свойству transitioningDelegate презентуемого контроллера.
  • UIViewControllerAnimatedTransitioning: Объект, реализующий этот протокол, непосредственно описывает анимацию. В его методах вы определяете, как view контроллера появляется на экране и как исчезает.

Пример реализации

Рассмотрим простую анимацию плавного увеличения и затухания.

// 1. Класс для анимации
class FadeInAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.5
    }
    
    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        // Получаем view контроллера, который появляется
        guard let toView = transitionContext.view(forKey: .to) else { return }
        let containerView = transitionContext.containerView
        
        // Начальное состояние: прозрачный и маленький
        toView.alpha = 0.0
        toView.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
        containerView.addSubview(toView)
        
        // Анимация к конечному состоянию
        UIView.animate(withDuration: 0.5, animations: {
            toView.alpha = 1.0
            toView.transform = .identity
        }, completion: { _ in
            // Важно сообщить системе об окончании перехода
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        })
    }
}

// 2. Класс делегата перехода
class CustomTransitionDelegate: NSObject, UIViewControllerTransitioningDelegate {
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // Возвращаем наш аниматор для показа
        return FadeInAnimator()
    }
    
    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // Можно вернуть другой аниматор для скрытия, например, обратную анимацию
        return FadeInAnimator() // для простоты используем тот же
    }
}

// 3. Использование в коде
let detailVC = DetailViewController()
let transitionDelegate = CustomTransitionDelegate()
detailVC.transitioningDelegate = transitionDelegate
// Устанавливаем modalPresentationStyle в .custom для кастомных переходов
detailVC.modalPresentationStyle = .custom
// Вызов презентации
self.present(detailVC, animated: true, completion: nil)

Где применяется

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

Вывод: Кастомную презентацию стоит применять, когда стандартные переходы iOS не соответствуют дизайну или логике вашего приложения, и вам нужен полный контроль над визуальной частью навигации для создания уникального пользовательского опыта.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    6

Навыки

  • Swift

    Swift

  • IOS

    IOS

Ключевые слова

#iOS

#UIViewController

#custom transition

#UIViewControllerTransitioningDelegate

#UIViewControllerAnimatedTransitioning

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.