2016-12-18 14 views
7

मैं एक लाइब्रेरी विकसित कर रहा हूं और मैं दो व्यू कंट्रोलर के बीच एक डिफ़ॉल्ट कस्टम संक्रमण प्रदान करना चाहता हूं, उपयोगकर्ता अपना स्वयं का कार्यान्वयन भी प्रदान कर सकता है जो मेरे दिमाग में आता है, UIViewController को ओवरराइड करना और लागू करना है UIViewControllerTransitioningDelegate और फिर उपयोगकर्ता मेरे CustomTransitionViewController को उपclass कर सकते हैं क्या यह करने का सबसे अच्छा तरीका है? कोई सीमाएं? डिफ़ॉल्ट कार्यान्वयन के साथ उदाहरण के लिए प्रोटोकॉल का उपयोग करके एक और अधिक सुरुचिपूर्ण तरीका है?UIViewController के लिए डिफ़ॉल्ट कस्टम संक्रमण

import UIKit 

class CustomTransitionViewController: UIViewController, UIViewControllerTransitioningDelegate { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.transitioningDelegate = self 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil:Bundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
     self.transitioningDelegate = self 
    } 

    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) 
    } 
} 

उत्तर

0

आप, साथ ही UIViewController कि सभी चीजें आप की आवश्यकता है और साथ ही अपने प्रोटोकॉल के अनुरूप है के लिए एक विस्तार, कि अर्थात अक्षमडिफ़ॉल्ट बदलाव करने के लिए उपयोगकर्ता सक्षम बनाता है बना सकता है।

एक उदाहरण के रूप:

protocol ThorsHammer { 
    var isDefaultTransitionEnabled: Bool { get set } 
} 

extension UIViewController: ThorsHammer { 
    var isDefaultTransitionEnabled: Bool { /* this part sucks */ } 

    // Check if the default transition should happen and 
    // do some transition magic 
} 

कैसे करें ऐड संग्रहीत गुणकरने के लिए एक्सटेंशन, आप this पर एक नज़र हो सकता था।

यह सब, आप विस्तार में किसी भी तरह transitioningDelegate स्थापित करने के लिए एक तरह से मिल सकता है, अन्यथा आप उपवर्ग करना होगा।

5

मुझे लगता है कि ऐसा करने के लिए सबसे सुरुचिपूर्ण (और प्रोटोकॉल उन्मुख) तरीकों में से एक 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 { } 

जो भी मार्ग से ले, यह समाधान आपको देता है कि तुम क्या आप बाहरी उपवर्गीकरण या बदसूरत उद्देश्य सी अवधारणाओं के साथ सौदा बनाने के बिना चाहते हैं। सौभाग्य!

संबंधित मुद्दे