मुझे लगता है कि ऐसा करने के लिए सबसे सुरुचिपूर्ण (और प्रोटोकॉल उन्मुख) तरीकों में से एक UIViewControllerTransitioningDelegate
एक्सटेंशन के साथ होगा। प्रोटोकॉल बढ़ाएं और animationController(forPresented: presenting: source:)
और animationController(forDismissed:)
के लिए एक डिफ़ॉल्ट कार्यान्वयन प्रदान करें। एक्सटेंशन इस तरह कुछ दिखाई देगा:
extension UIViewControllerTransitioningDelegate where Self: UIViewController {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return FadeInAnimator(transitionDuration: 0.5, startingAlpha: 0.8)
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return FadeInAnimator(transitionDuration: 0.5, startingAlpha: 0.8)
}
}
और फिर अपने उपयोगकर्ताओं को इस प्रोटोकॉल के अनुरूप उनके दृश्य नियंत्रकों का विस्तार करने के लिए कहें। आप पहले से ही एक प्रोटोकॉल विस्तार में केवल आवश्यकताओं कार्यान्वित के बाद से, सभी वे क्या करने की जरूरत है, अनुरूपता घोषणा जोड़ें ताकि तरह है:
class MyViewController: UIViewController, UIViewControllerTransitioningDelegate { }
आप सभी UIViewController
रों ऐसा करने के लिए विस्तार करना चाहते हैं, तो आप के साथ यह कर सकते हैं एक खाली विस्तार:
extension UIViewController: UIViewControllerTransitioningDelegate { }
यह काम करना चाहिए। मेरी राय में, यह एक बहुत ही साफ, सुरुचिपूर्ण समाधान है जिसे अनावश्यक उप-वर्गीकरण की आवश्यकता नहीं होती है। यह प्रत्येक दृश्य नियंत्रक में animationController(forPresented: presenting: source:)
और animationController(forDismissed:)
के विभिन्न कार्यान्वयन प्रदान करना भी आसान बनाता है। आपके उपयोगकर्ता केवल दो उपरोक्त कार्यों के अपने कार्यान्वयन को जोड़ सकते हैं जहां भी वे चाहते हैं। इसके अलावा, आपको संबंधित वस्तुओं जैसे गन्दा उद्देश्य सी सामान से निपटने की आवश्यकता नहीं है।
यदि आप इस कार्यक्षमता को किसी प्रकार के प्रीपेक्टेड बंडल में प्रदान कर रहे हैं और आप अंतर्निहित कार्यान्वयन को छिपाना चाहते हैं, तो आप अपना खुद का प्रोटोकॉल घोषित कर सकते हैं, इसे UIViewControllerTransitioningDelegate
का सबप्रोटोकॉल बनाएं, इसे समान रूप से बढ़ाएं, और आपके उपयोगकर्ता अनुरूप हों UIViewControllerTransitioningDelegate
के बजाय अपने कस्टम प्रोटोकॉल:
protocol MyProtocol: UIViewControllerTransitioningDelegate {
//Add your own requirements (if you have any).
}
extension MyProtocol where Self: UIViewController {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return FadeInAnimator(transitionDuration: 0.5, startingAlpha: 0.8)
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return FadeInAnimator(transitionDuration: 0.5, startingAlpha: 0.8)
}
//Satisfy your requirements (or let your users do it).
}
class MyViewController: UIViewController, MyProtocol { }
extension UIViewController: MyProtocol { }
जो भी मार्ग से ले, यह समाधान आपको देता है कि तुम क्या आप बाहरी उपवर्गीकरण या बदसूरत उद्देश्य सी अवधारणाओं के साथ सौदा बनाने के बिना चाहते हैं। सौभाग्य!