При создании анимированного перехода в приложении iOS с помощью UIKit мы обычно используем UIAnimedNavigationTransition между двумя контроллерами представления. Однако новое бизнес-требование требует замены одного из контроллеров представления представлением SwiftUI. Как мы можем заставить анимированный переход навигации между представлением SwiftUI и контроллером представления UIKit? Есть ли способ добиться этого?
Кроме того, существует ли какая-либо документация, объясняющая, как был создан UIHostingController, а не только как его реализовать? Понимание его создания могло бы помочь найти обходной путь, но мне не удалось найти никаких ресурсов по этому вопросу.
Это не то. :)
вам необходимо проверить документацию Apple для создания контроллера представления хостинга Developer.apple.com/documentation/swiftui/uihostingcontroller
вам нужно создать аниматора и делегата перехода
import UIKit
class Animator: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
guard let fromVC = transitionContext.viewController(forKey: .from),
let toVC = transitionContext.viewController(forKey: .to) else {
return
}
let containerView = transitionContext.containerView
containerView.addSubview(toVC.view)
toVC.view.frame = fromVC.view.frame
toVC.view.alpha = 0.0
UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
toVC.view.alpha = 1.0
}) { finished in
fromVC.view.removeFromSuperview()
transitionContext.completeTransition(finished)
}
}
}
import UIKit
class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return Animator()
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return Animator()
}
}
затем примените делегат перехода к контроллеру представления хоста пользователя в файле контроллера представления при нажатии кнопки
//MARK: - Properties
let transitionDelegate = TransitioningDelegate()
//MARK: - Button Action
@objc func showSwiftUIView() {
let swiftUIView = SwiftUIView()
let hostingController = UIHostingController(rootView: swiftUIView)
hostingController.modalPresentationStyle = .fullScreen
hostingController.transitioningDelegate = transitionDelegate
present(hostingController, animated: true, completion: nil)
}
Ты молодец!!!!!😄
Возможно, это то, что вы ищете: sarunw.com/posts/swiftui-view-as-uiview