सभी उत्तर पढ़ें और सही समाधान नहीं देख सकते हैं। ऐसा करने का सही तरीका यह है कि आप कस्टम वीसी डेलीगेट के लिए कस्टम UIViewControllerAnimatedTransitioning बनाएं।
तो यह और अधिक कदम बनाने के लिए मानता है, लेकिन परिणाम अधिक अनुकूलन योग्य है और कुछ साइड इफेक्ट नहीं है, जैसे प्रस्तुत दृश्य के साथ एक साथ देखने से बढ़ रहा है।
तो, मान लें कि आपके पास कुछ ViewController है, और प्रस्तुत करने के लिए एक विधि है
var presentTransition: UIViewControllerAnimatedTransitioning?
var dismissTransition: UIViewControllerAnimatedTransitioning?
func showSettings(animated: Bool) {
let vc = ... create new vc to present
presentTransition = RightToLeftTransition()
dismissTransition = LeftToRightTransition()
vc.modalPresentationStyle = .custom
vc.transitioningDelegate = self
present(vc, animated: true, completion: { [weak self] in
self?.presentTransition = nil
})
}
presentTransition
और dismissTransition
आपके दृश्य नियंत्रकों को एनिमेट करने के लिए उपयोग किया जाता है। तो आप अपना ViewController UIViewControllerTransitioningDelegate
:
extension ViewController: UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return presentTransition
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return dismissTransition
}
}
इसलिए अंतिम चरण अपना कस्टम संक्रमण बनाना है:
class RightToLeftTransition: NSObject, UIViewControllerAnimatedTransitioning {
let duration: TimeInterval = 0.25
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let container = transitionContext.containerView
let toView = transitionContext.view(forKey: .to)!
container.addSubview(toView)
toView.frame.origin = CGPoint(x: toView.frame.width, y: 0)
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: {
toView.frame.origin = CGPoint(x: 0, y: 0)
}, completion: { _ in
transitionContext.completeTransition(true)
})
}
}
class LeftToRightTransition: NSObject, UIViewControllerAnimatedTransitioning {
let duration: TimeInterval = 0.25
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let container = transitionContext.containerView
let fromView = transitionContext.view(forKey: .from)!
container.addSubview(fromView)
fromView.frame.origin = .zero
UIView.animate(withDuration: duration, delay: 0, options: .curveEaseIn, animations: {
fromView.frame.origin = CGPoint(x: fromView.frame.width, y: 0)
}, completion: { _ in
fromView.removeFromSuperview()
transitionContext.completeTransition(true)
})
}
}
उस कोड में कंट्रोलर को वर्तमान संदर्भ में प्रस्तुत किया जाता है, आप उस बिंदु से अपने अनुकूलन कर सकते हैं। इसके अलावा आप देख सकते हैं कि कस्टम UIPresentationController
उपयोगी है (उपयोग में पास UIViewControllerTransitioningDelegate
)