नेविगेशन बार शो / छुपाएँ


158

मेरे पास एक नेविगेशन बार है जिसमें 2 बार बटन हैं। जब कोई उपयोगकर्ता स्क्रीन को टैप करता है तो मैं इस नेविगेशन बार को छिपाना और दिखाना चाहता हूं।

प्रारंभ में, नेविगेशन बार को छिपाया जाना चाहिए। जब कोई उपयोगकर्ता स्क्रीन पर डबल टैप करता है, तो नेविगेशन बार को एक एनीमेशन के साथ आना चाहिए, जैसे कि iPhone की फोटो गैलरी में क्या देखा जा सकता है।

मैं यह कैसे कर सकता हूं? सुझावों की हमेशा सराहना की जाती है।

जवाबों:


381

यह कुछ ऐसा नहीं है जो कोड की कुछ पंक्तियों में फिट हो सकता है, लेकिन यह एक दृष्टिकोण है जो आपके लिए काम कर सकता है।

नेविगेशन बार को छिपाने के लिए:

[[self navigationController] setNavigationBarHidden:YES animated:YES];

इसे दिखाने के लिए:

[[self navigationController] setNavigationBarHidden:NO animated:YES];

इस विधि के लिए प्रलेखन यहाँ उपलब्ध है

"डबल क्लिक" या डबल-टैप करने के लिए सुनने के लिए, उपवर्ग UIViewऔर उस उपवर्ग का एक उदाहरण बनाएं जो आपके दृश्य नियंत्रक की viewसंपत्ति है।

दृश्य उपवर्ग में, इसकी -touchesEnded:withEvent:विधि को ओवरराइड करें और गिनें कि आप कितने समय में कितने स्पर्श प्राप्त करते हैं, लगातार दो नलों के बीच के समय को मापकर, शायद CACurrentMediaTime()। या से परिणाम का परीक्षण करें [touch tapCount]

यदि आपको दो नल मिलते हैं, तो आपका उप-वर्ग दृश्य उन समस्याओं को जारी करता है NSNotificationजिन्हें सुनने के लिए आपके नियंत्रक ने पंजीकृत किया है।

जब आपका दृश्य नियंत्रक सूचना सुनता है, तो यह चयनकर्ता को आग लगा देता है कि या तो नेविगेशन बार के वर्तमान दृश्यमान स्थिति के आधार पर, उपरोक्त बार कोड का उपयोग करके नेविगेशन बार को छुपाता है या दिखाता है, नेविगेशन बार की isHiddenसंपत्ति को पढ़कर एक्सेस किया जाता है ।

संपादित करें

नल की घटनाओं से निपटने के लिए मेरे जवाब का हिस्सा संभवतः iOS 3.1 से पहले उपयोगी है। UIGestureRecognizerवर्ग शायद डबल नल, इन दिनों निपटने के लिए एक बेहतर तरीका है।

EDIT 2

नेविगेशन बार को छिपाने का स्विफ्ट तरीका है:

navigationController?.setNavigationBarHidden(true, animated: true)

इसे दिखाने के लिए:

navigationController?.setNavigationBarHidden(false, animated: true)

यदि यह एक फोटो दर्शक अनुप्रयोग के लिए है, तो नौसेना बार को छुपाने से छवि को देखने के लिए एक अप्रिय छलांग लगती है, जिसे मैंने नहीं रोका कि कैसे रोका जाए। 3.2 आपको डबल टैप के लिए UIGestureRecognizer का उपयोग करने की सुविधा देता है, जो कि एक बहुत ही नॉट्रर अप्रोच (iPad के लिए केवल atm) है।
पॉल लिंच

बहुत बहुत धन्यवाद एलेक्स, यू ने मुझे बहुत सारी जानकारी प्रदान की, जो उर दिशानिर्देशों का पालन करने वाला था .. धन्यवाद एक टन
शिशिर

क्या यह टैब बार के लिए लागू होता है ??? अगर मैं टैब बारों को छिपा / दिखाना चाहता / चाहती हूँ, तो मुझे क्या करना है? सादर शिशिर
शिशिर। बॉबी

1
क्या इस 'कूद' पॉल को रोकने का कोई तरीका है? मुझे वही समस्या है और मुझे नहीं पता, इसका क्या कारण है .... न तो मुझे लगता है, न ही कभी कोई इस पर ठोकर खाता है।
इके

'जंप' को होने से रोकने के लिए आपको नेविगेशन बार को छुपाने / दिखाने के बाद स्क्रोलव्यू की कंटेंटसेट प्रॉपर्टी को ज्यूसी मेंशन के रूप में रीसेट करना होगा। अर्थात। self.scrollView.contentInset = UIEdgeInsetsZero
crafterm

17

यह कोड आपकी मदद करेगा।

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
initWithTarget:self action:@selector(showHideNavbar:)];
[self.view addGestureRecognizer:tapGesture];

-(void) showHideNavbar:(id) sender 
{ 
// write code to show/hide nav bar here 
// check if the Navigation Bar is shown
if (self.navigationController.navigationBar.hidden == NO)
{
// hide the Navigation Bar
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
// if Navigation Bar is already hidden
else if (self.navigationController.navigationBar.hidden == YES)
{
// Show the Navigation Bar
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
}

16

सबसे पहले iOS के लिए व्यू कंट्रोलर प्रोग्रामिंग गाइड में सेक्शन को पढ़ें, 'नेवीगेशन व्यूज के लिए एक फुल-स्क्रीन लेआउट को अपनाना' और कस्टम व्यू के लिए उसी सेक्शन के बारे में। यदि आप Photos.app की तरह कुछ करने की कोशिश कर रहे हैं तो आप शायद स्क्रॉल दृश्य का उपयोग कर रहे हैं। टिप्पणी पर ध्यान दें कि नेविगेशन बार स्वचालित रूप से नेविगेशन बार (और स्टेटस बार) की ऊंचाई के लिए अपने स्क्रॉल दृश्य के लिए एक स्क्रॉल सामग्री इनसेट जोड़ते हैं, इसलिए आपको अपने स्क्रॉल दृश्य की सामग्रीसेटसेट संपत्ति को शून्य पर वापस सेट करना होगा (UIEdgeInsetsetsero) इसके ठीक बाद नेविगेशनबार की प्रारंभिक स्थिति और दृश्य दिखाई देने से पहले सेट करना।

फिर अगर आपके पास एक एकल नल है जो नेविगेशनबार और / या स्थिति पट्टी को दिखाने या छिपाने के लिए टॉगल करता है, तो आपको टॉगल करने की विधि में दो काम करने होंगे। पहली बार लगता है कि नेविगेशन दृश्य को बदलने से पहले स्क्रॉल दृश्य की कन्टैंटऑफ़सेट संपत्ति को सहेजना और बाद में कन्टैंटऑफ़सेट पर अपने सहेजे गए मान को पुनर्स्थापित करना है। और नेविगेशनबेरहेड प्रॉपर्टी को बदलने के बाद फिर से UIEdgeInsetsZero को कंटेंट इनसेट प्रॉपर्टी को जीरो कर दें। इसके अलावा, यदि आप स्टेटस बार को टॉगल कर रहे हैं, तो आपको नेविगेशनबार की स्थिति को बदलने से पहले इसकी स्थिति को बदलना होगा।


1
ContentOffset और contentInset नोट के लिए बहुत बहुत धन्यवाद। आप असली हीरो हैं।
अल्टिलाइसिस 5

मैं सहमत हूँ, तुम असली नायक हो, यहाँ! बहुत बहुत धन्यवाद।
गायन

9

में स्विफ्ट इस कोशिश,

navigationController?.isNavigationBarHidden = true  //Hide
navigationController?.isNavigationBarHidden = false //Show

या

navigationController?.setNavigationBarHidden(true, animated: true) //Hide
navigationController?.setNavigationBarHidden(false, animated: true) //Show

7

नेविगेशन बार छिपाने के लिए:

[self.navigationController setNavigationBarHidden:YES animated:YES];

नेविगेशन बार दिखाने के लिए:

[self.navigationController setNavigationBarHidden:NO animated:YES];

आईओएस 7 में, ऑटो पूर्ण वास्तव में इस समाधान को बढ़ावा देता है क्योंकि सबसे ज्यादा मतदान किया जाता है।
एलेक्स ज़ावाटोन

7

यहाँ एक बहुत ही त्वरित और सरल उपाय है:

self.navigationController.hidesBarsOnTap = YES;

यह डबल टैप के बजाय सिंगल टैप पर काम करेगा। इसके अलावा यह वर्तमान दृश्य नियंत्रक को धक्का या पॉप करने के बाद भी नेविगेशन नियंत्रक के लिए व्यवहार को बदल देगा।

आप इस व्यवहार को हमेशा अपने कंट्रोलर में viewWillAppear: और viewWillDisappear के रूप में संशोधित कर सकते हैं: यदि आप केवल एक व्यू कंट्रोलर के लिए व्यवहार सेट करना चाहते हैं, तो क्रियाएँ।

यहाँ प्रलेखन है :


5

एक तरीका बार विजिबिलिटी "शो नेविगेशन बार" को अट्रैक्शन इंस्पेक्टर को अनचेक करके हो सकता है। किसी की मदद करें।

यहां छवि विवरण दर्ज करें


2

स्विफ्ट 4.2 और एक्सकोड 10 में

self.navigationController?.isNavigationBarHidden = true  //Hide
self.navigationController?.isNavigationBarHidden = false  //Show

यदि आप केवल 1 वीसी में नेविगेशन बार प्रदर्शित नहीं करना चाहते हैं, लेकिन आप 2 वें वीसी के शो में प्रदर्शन करना चाहते हैं

अपने 1st VC में यह कोड लिखें।

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true  //Hide
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.isNavigationBarHidden = false  //Show
}

2

यदि आप नेविगेशन बार की स्थिति का पता लगाना चाहते हैं तो उसे छिपाया / दिखाया गया है। आप पता लगाने के लिए बस निम्नलिखित कोड का उपयोग कर सकते हैं -

if self.navigationController?.isNavigationBarHidden{
    print("Show navigation bar")
} else {
    print("hide navigation bar")
}


-4

स्विफ्ट कोड: यह पूरी तरह से iOS 3.2 और बाद के लिए काम करता है।

  override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")let tapGesture = UITapGestureRecognizer(target: self, action: "hideNavBarOntap")
    tapGesture.delegate = self
    self.view.addGestureRecognizer(tapGesture)

फिर लिखें

func hideNavBarOntap() {
    if(self.navigationController?.navigationBar.hidden == false) {
        self.navigationController?.setNavigationBarHidden(true, animated: true) // hide nav bar is not hidden
    } else if(self.navigationController?.navigationBar.hidden == true) {
        self.navigationController?.setNavigationBarHidden(false, animated: true) // show nav bar
    }
}

1
मेरा मानना ​​है कि यह एक खराब समाधान है, एक टैप जेस्चर को जोड़ने से अगर यूआईटेबल व्यू या यूआईसीओलेक्टियन व्यू जैसे अन्य विचारों पर सही तरीके से इशारों को कॉन्फ़िगर नहीं किया जा सकता है। इसके अलावा, एक बूलियन की जाँच करना == सच बेमानी है और यह अच्छा व्यवहार है यह सोचकर अन्य प्रोग्रामर का नेतृत्व कर सकते हैं। आप ऊंट मामले का भी दुरुपयोग कर रहे हैं और अपने उदाहरण में एक अंतिम ब्रेस गुम कर रहे हैं। ध्यान रखें कि स्विफ्ट के बाद से 2.2 चयनकर्ताओं को भी अपडेट किया गया है। अंत में स्विफ्ट केवल iOS 7 और इसके बाद के संस्करण पर समर्थित है और निश्चित रूप से iOS 3.2 पर नहीं चलेगी
डेविड रीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.