2015-03-25 16 views
6

के साथ कस्टम टैबबार मैं टैब बार के अंदर नेविगेशन तत्वों के साथ एक टैबड एप्लिकेशन बनाने की कोशिश कर रहा हूं, जैसा कि नीचे की तस्वीर (लाल बार) में स्विफ्ट/एक्सकोड 6.2 का उपयोग करके देखा गया है। मूल रूप से बीच में उन तीन आइकन उपयोगकर्ता को अलग-अलग दृश्य नियंत्रकों को निर्देशित करेंगे। अन्य दो प्रतीक संदर्भ-आधारित होंगे। उदाहरण के लिए, तालिका दृश्य पृष्ठ पर आप मेनू आइकन देखेंगे और छवि में दिखाई देने वाले नए आइकन को जोड़ देंगे। हालांकि, एक पंक्ति पर क्लिक करने से मेनू आइकन को बैक आइकन में बदल दिया जाएगा, और कुछ और आइकन जोड़ें।एक्सकोड 6 - स्विफ्ट - नेविगेशन

यह सामान्य विचार है, लेकिन मुझे इसके करीब कुछ भी लागू करने में बहुत कठिन समय है। पहला मुद्दा यह है कि जब भी मैं एक टैब बार नियंत्रक में एक दृश्य एम्बेड करता हूं, तो मैं टैब बार को शीर्ष पर नहीं ले जा सकता। हालांकि, जब मैं एक व्यू कंट्रोलर में एक कस्टम UITabView बनाता हूं, तो नियंत्रण + क्लिक करें और टैब बार आइटम को किसी अन्य दृश्य में खींचने से कोई सीगू नहीं बनता है। मैंने बार के अंदर नेविगेशन तत्वों से निपटने के लिए भी शुरू नहीं किया है।

मुझे लगता है कि मैं जो पूछ रहा हूं वह इस बात से निपटने के लिए किस मार्ग पर लेना है, इस पर थोड़ा सा मार्गदर्शन है। मुझे लगता है कि मैं टैब बार कंट्रोलर या नेविगेशन कंट्रोलर का उपयोग नहीं कर सकता क्योंकि ऐसा प्रतीत नहीं होता है कि मैं उन्हें इतना अनुकूलित कर सकता हूं। तो कस्टम टैब बार और नेविगेशन बार्स, और फिर segues लागू करें और बटन प्रोग्रामेटिक रूप से बदलता है?

धन्यवाद।

Tab Bar with Navigation

उत्तर

12

मैं एक वास्तुशिल्प के नजरिए से आपका मार्गदर्शन करने की कोशिश करेंगे (ताकि आप नीचे ज्यादा कोड नहीं मिलेगा)।

एक UITabBarController

का उपयोग करते हुए आदेश प्राप्त करने के लिए आप क्या सुझाव दे रहे हैं में, आप सही आप एक UITabBarController सीधे, कई कारणों के बीच उपयोग नहीं कर सकते हैं, ज्यादातर तत्काल एक है कि वे हमेशा के लिए होती हैं है नीचे पर और आप इसे शीर्ष पर चाहते हैं (Apple's docs देखें)। अच्छी खबर यह है कि शायद आपको इसकी आवश्यकता नहीं है!

नोट: आप अभी भी किसी भी कारण से एक UITabBarController के साथ जाना चाहते हैं, को देखने के लिए कृपया @ मैट answer

एक UINavigationController

का उपयोग करते हुए आप एक UINavigationController का उपयोग इस कार्य को हल करने के लिए कर सकते हैं एक UINavigationController की UINavigationBar अनुकूलित किया जा सकता के बाद से। अपने navigationItem स्थापित करने के लिए आप बस जरूरत

  1. एक UINavigationBar के बटन जोड़ने को अनुकूलित करने के लिए, वहाँ आप कैसे प्राप्त करने के लिए आप क्या प्रस्ताव है आपके विचार के पदानुक्रम व्यवस्थित कर सकते हैं पर कई तरीके हैं, लेकिन मुझे एक ही विकल्प विस्तृत जाने के शीर्षक दृश्य:

    // Assuming viewWithTopButtons is a view containing the 3 top buttons 
    self.navigationItem.titleView = viewWithTopButtons 
    
  2. एक UINavigationController पर बर्गर मेनू कार्यक्षमता को जोड़ने के लिए आपपा सकते हैंposts इसे कैसे करें और अनंत ढांचे का उपयोग कैसे करें। एक और विस्तृत उत्तर के लिए यह अन्य SO Question देखें (उदा। MMDrawerController, ECSlidingViewController जोड़े का उल्लेख करने के लिए)।

  3. अपने दृश्य पदानुक्रम को व्यवस्थित करने के बारे में, यह वास्तव में इस बात पर निर्भर करता है कि जब उपयोगकर्ता मुख्य शीर्ष बटनों में से एक को टैप करता है, तो यह हमेशा नए अनुभाग में पहले दृश्य नियंत्रक पर जाएगा या यदि आप उसे वापस ले जाना चाहते हैं उस अनुभाग में अंतिम दृश्य जहां वह था।

    3.1 स्विचिंग वर्गों आपके ऐप का UIWindow एक भी UINavigationController पदानुक्रम के शीर्ष पर होगा नया अनुभाग

    का पहला दृश्य प्रदर्शित करता है। फिर 3 शीर्ष बटनों में से प्रत्येक, जब टैप किया जाता है, UINavigationController के रूट व्यू कंट्रोलर को बदल देगा।

    फिर, यदि उपयोगकर्ता अनुभाग बदल जाता है जब, वर्तमान नेविगेशन पदानुक्रमUINavigationController रूट दृश्य नियंत्रक के रूप में नया अनुभाग दृश्य नियंत्रक की स्थापना द्वारा खारिज कर दिया गया है।

    यह ऊपर है, जहां अपने अपने वर्गों के प्रत्येक का अपना UINavigationController होगा की एक थोड़ा संशोधित संस्करण की आवश्यकता होगी, तो आप ऐसा

    self.navigationController = [sectionFirstViewController] 
    

    3,2 स्विचिंग अनुभाग नए खण्ड के अंतिम दिखाया गया दृश्य प्रदर्शित करता है प्रति अनुभाग एक नेविगेशन पदानुक्रम हमेशा रख सकते हैं।

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

    window.rootViewController = sectionNavigationController 
    

कोई कस्टम प्रवर्तन

बेशक

, पिछले और भी बहुत मान्य विकल्प होगा कि आप अपने आप अपनी आवश्यकताओं को प्राप्त करने के लिए अपने स्वयं के घटक लागू का उपयोग करना। यह शायद उच्चतम अनुकूलन के आदान-प्रदान में सबसे बड़ा प्रयास करने की आवश्यकता है।

इस विकल्प का चयन निश्चित रूप से कम अनुभवी डेवलपर्स को अनुशंसा नहीं करता है।

+0

मुझे अपना शीर्षक कहां देखना चाहिए? यदि मैं स्टोरीबोर्ड एनवी नियंत्रक से जुड़े एक कस्टम नेविगेशन नियंत्रक में करता हूं, तो शीर्षक दृश्य दिखाई नहीं देता है। यदि मैं इसे 3 मुख्य व्यू कंट्रोलर में से एक में करता हूं, तो यह काम करता है, लेकिन क्या इसका मतलब यह नहीं होगा कि मुझे कस्टम शीर्षक को तीन बार देखना शुरू करना होगा? –

+1

आपको हर बार आइटम के साथ कस्टम व्यू को प्रारंभ करने की ज़रूरत नहीं है, केवल एक बार और फिर हां, आपको अभी भी प्रत्येक 'UIViewController' में 'titleView' के रूप में असाइन करने की आवश्यकता है। मैं इसे करने का एक और तरीका नहीं सोच सकता अगर यह किसी प्रकार की उपस्थिति सेटअप का उपयोग नहीं कर रहा है, लेकिन यह सुनिश्चित नहीं है कि यह कैसे काम करेगा। वैसे भी, 'UINavigationController', अनुभाग * के लिए [डॉक्स] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/index.html) पर एक नज़र डालने लायक हो सकता है नेविगेशन बार * आपको कुछ विचार दे सकता है। – veducm

3

मैं इस पर एक स्टैब लेना चाहता हूं - मुझे लगता है कि यहां एक टैब बार नियंत्रक का उपयोग करना संभव है।

  • आपका सर्वोच्च-स्तरीय दृश्य नियंत्रक एक छिपा UITabBar के साथ एक UITabBarController हो जाएगा।
  • प्रत्येक टैब UINavigationController में निहित है।
  • नेविगेशन नियंत्रक में सभी दृश्य नियंत्रक दृश्य नियंत्रक का एक उप-वर्ग होगा (कहें, SwitchableViewController)।
  • SwitchableViewControllerviewDidLoad में, आपने नेविगेशन आइटम का शीर्षक दृश्य (यानी जो कुछ भी केंद्र में है; self.navigationItem.titleView) को तीन केंद्र बटन रखने वाले दृश्य के रूप में सेट किया है। UISegmentedControl, या एक कस्टम दृश्य हो सकता है।
  • जब भी आप किसी भी बटन पर टैप करते हैं, तो आप दृश्य नियंत्रक को शीर्ष UITabBarController के चयनित इंडेक्स को बदलना चाहते हैं।

समस्याएं दी हो सकता है: टैब के अंदर

  • टेबल विचारों नीचे भले ही टैब बार छिपा हुआ है पर एक scrollIndicatorOffset होगा।
    • समाधान: टैब बार नियंत्रक के automaticallyAdjustsScrollViewInsets या आंतरिक दृश्य नियंत्रक के साथ खेलें। https://stackoverflow.com/a/29264073/855680
  • जब भी आप नेविगेशन स्टैक में एक नया व्यू कंट्रोलर दबाते हैं तो आपका शीर्षक दृश्य एनिमेटेड होगा।
    • समाधान: UINavigationController के लिए एक कस्टम संक्रमण एनीमेशन बनाने पर एक नज़र डालें।
+0

मुझे खिड़की के रूट व्यू कंट्रोलर को प्रभावी ढंग से बदलने के लिए छुपा 'UITabBarController' रखने के लाभों के बारे में निश्चित नहीं है। लेकिन * मुझे अभी भी लगता है कि यह एक दिलचस्प दृष्टिकोण है * और मैं आपसे पूछना चाहता हूं, हालांकि मुझे पता है कि इसका मतलब आपकी प्रतिष्ठा में वृद्धि नहीं करना है, लेकिन पूरा होने के लिए, यदि आप इस विकल्प को जोड़ने के लिए मेरे उत्तर को संपादित करने पर विचार करेंगे। – veducm

+0

आह, लेकिन 'UITabBarController' * * विंडो की मूल दृश्य नियंत्रक है। –

+0

हां, मैं समझता हूं कि, लेकिन मैं जो कहने की कोशिश कर रहा था वह यह है कि आप इसका उपयोग करने का एकमात्र कारण विंडो के रूट व्यू कंट्रोलर को बदलना है ... जिसे आप सीधे 'UIWindow' में कर सकते हैं, अगर आपने किया 'UITabBarController 'नहीं है, है ना? – veducm

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