/
sberpay
/
AgeGate-iOS
Обзор
Документация
Войти
/
sberpay
/
AgeGate-iOS
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
develop
AgeGateSDK/Navigation/Transition/CoverPresentationController.swift
86 строк
3 KB
SergeyGladkiy
[0.2.0] БДСЧ сценарий
30 июл 2026, 21:57
30 июл 2026, 21:57
cbcdfcb
Код
Авторство
О чём код?
// // CoverPresentationController.swift // SPaySdk // // Created by Alexander Ipatov on 05.12.2022. // import UIKit /// Шторка прижата к низу, высота не больше экрана минус safe area сверху. /// Затемнение под ней появляется вместе с показом. final class AGTCoverPresentationController: UIPresentationController { override var shouldPresentInFullscreen: Bool { false } /// Полноэкранный режим: шторка занимает всю доступную высоту /// (контейнер минус вырез сверху). Для экрана БДСЧ. var isFullHeight = false private lazy var dimmView: UIView = { let view = UIView() view.backgroundColor = .black.withAlphaComponent(0.2) view.tag = .agtDimmViewTag return view }() override func presentationTransitionWillBegin() { super.presentationTransitionWillBegin() guard let containerView, let presentedView else { return } presentedView.translatesAutoresizingMaskIntoConstraints = false dimmView.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(dimmView) containerView.addSubview(presentedView) dimmView.alpha = 0 animateAlongsideTransition { self.dimmView.alpha = 1 } NSLayoutConstraint.activate([ dimmView.topAnchor.constraint(equalTo: containerView.topAnchor), dimmView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), dimmView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), dimmView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), presentedView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), presentedView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), presentedView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), presentedView.heightAnchor.constraint(lessThanOrEqualTo: containerView.heightAnchor, constant: -containerView.safeAreaInsets.top) ]) } private func heightConstraint(for presentedView: UIView, in containerView: UIView) -> NSLayoutConstraint { if isFullHeight { // На весь экран целиком, включая область под вырезом. return presentedView.heightAnchor.constraint( equalTo: containerView.heightAnchor) } // По контенту, но не выше экрана минус вырез сверху. return presentedView.heightAnchor.constraint( lessThanOrEqualTo: containerView.heightAnchor, constant: -containerView.safeAreaInsets.top) } override func presentationTransitionDidEnd(_ completed: Bool) { guard !completed else { return } dimmView.removeFromSuperview() presentedView?.removeFromSuperview() } override func dismissalTransitionWillBegin() { super.dismissalTransitionWillBegin() animateAlongsideTransition { self.dimmView.alpha = 0 } } private func animateAlongsideTransition(_ animation: @escaping AGTAction) { guard let coordinator = presentedViewController.transitionCoordinator else { animation() return } coordinator.animate { _ in animation() } } }