iPhone पहले पृष्ठ पर केवल नेविगेशन बार को छुपाता है


381

मेरे पास नीचे का कोड है जो छुपाता है और नेविगेशनल बार दिखाता है। इसे तब छिपाया जाता है जब पहला दृश्य लोड होता है और फिर छिपाया जाता है जब "बच्चों" को बुलाया जाता है। परेशानी यह है कि जब वे मूल दृश्य पर वापस जाते हैं, तो मैं इसे फिर से छिपाने के लिए इसे ट्रिगर करने के लिए ईवेंट / एक्शन नहीं पा सकता ...।

रूट पेज पर मेरा "परीक्षण" बटन है जो मैन्युअल रूप से कार्रवाई करता है लेकिन यह सुंदर नहीं है और मैं चाहता हूं कि यह स्वचालित हो।

-(void)hideBar 
{
    self.navController.navigationBarHidden = YES;
}
-(void)showBar 
{       
    self.navController.navigationBarHidden = NO;
}

जवाबों:


1035

सबसे अच्छा समाधान मैंने पाया है कि पहले दृश्य नियंत्रक में निम्नलिखित करना है ।

उद्देश्य सी

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [super viewWillDisappear:animated];
}

तीव्र

override func viewWillAppear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
} 

जब आप UIViewControllerस्टैक पर अगली को धक्का देते हैं, तो बाईं ओर से चेतन बार (अगले दृश्य के साथ) के लिए नेविगेशन बार और बाईं ओर (पुराने दृश्य के साथ) को चेतन करेंगे, जब आप पीछे का बटन दबाते हैं UINavigationBar

कृपया ध्यान दें कि ये प्रतिनिधि तरीके नहीं हैं, आप UIViewControllerइन विधियों के कार्यान्वयन को ओवरराइड कर रहे हैं , और प्रलेखन के अनुसार आपको अपने कार्यान्वयन में सुपर के कार्यान्वयन को कहीं न कहीं कॉल करना होगा


2
यह पूरी तरह से चट्टानों! मैं कम से कम एक दिन के लिए इससे जूझ रहा था। धन्यवाद!!!
जेम्स टेस्टा

26
चेतावनी: यह एक बहुत बुरा बग बनाता है जब एक तेज बैकस्वाइप करता है। मान लें कि A (कोई नावबार नहीं है) और B (नावबार के साथ) स्टैक पर धकेल दिया गया। जब बी को देखते हैं और एक तेज बैकस्वाइप करते हैं, लेकिन बी पर रहने के लिए जल्दी रिलीज करते हैं, तो नावबार अभी भी छिपा हुआ है। अब वापस जाने का कोई रास्ता नहीं है। इसके कारण है animated=YES। मुझे पता है कि यह बदसूरत लग रहा है animated=NO, लेकिन ऐसा लगता है कि जब नेवबार को छिपाने के लिए एनीमेशन अभी तक समाप्त नहीं हुआ है, तो इसे फिर से दिखाने के लिए एनीमेशन को अनदेखा किया गया है। अभी तक कोई हल नहीं निकला।
फैब

3
स्विफ्ट में: ओवरराइड funcillAppear (एनिमेटेड: बूल) {self.navigationController? ?SetNavigationBarHidden (सच्चा, एनिमेटेड: super) super.viewWillAppear (सच)} func viewWillDisappear (एनिमेटेड: बूल) {self.navigationController.setroll.set पर जाएं। एनिमेटेड: गलत) super.viewWillDisappear (सही)}
किटसन

7
प्रश्न 2010 में उत्तर दिया गया था और 2015 के अंत में मेरी मदद करता है! धन्यवाद।
इलोहि

1
अब इसे मैं एक पौराणिक उत्तर कहता हूं। शानदार ट्रिक मेट। दशकों के बाद भी काम कर रहा है ... समान रूप से तेजी से लागू किया, निर्दोष रूप से काम कर रहा है। यदि आपका जवाब @Alan रोजर्स के लिए +1
onCompletion

62

एक और दृष्टिकोण जो मुझे मिला है वह है NavigationController:

navigationController.delegate = self;

और प्रयोग setNavigationBarHiddenमेंnavigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController 
      willShowViewController:(UIViewController *)viewController 
                    animated:(BOOL)animated 
{   
    // Hide the nav bar if going home.
    BOOL hide = viewController != homeViewController;
    [navigationController setNavigationBarHidden:hide animated:animated];
}

ViewControllerएक ही स्थान पर सभी के लिए व्यवहार को अनुकूलित करने का आसान तरीका ।


यह कब मिलेगा?
झलक पटेल

1
सही समाधान। यह स्वीकृत उत्तर होना चाहिए। धन्यवाद!
समाह

एकदम सही जवाब। यह उस स्थिति में भी काम करता है जब हम पहले व्यू कंट्रोलर पर व्यूप्ले एपियर और व्यूवेलडिसपियर के तरीकों को ओवरराइड नहीं कर सकते।
पज्जुइलियूनस

1
बहुत बढ़िया। चुना हुआ उत्तर ठीक काम करता है, हालांकि केवल साधारण ऐप में। यह उत्तर तब काम करता है जब नौसेना पट्टी एक टैब नियंत्रक में होती है और विभिन्न तरीकों से विभिन्न कुलपतियों को धक्का / प्रस्तुत करती है।
जोनाथन विंगर-लैंग

यह सबसे अच्छा जवाब है। शीर्ष उत्तर @ fabb विवरण के रूप में बग हो सकता है ।
रयान.यूएन

18

एक मामूली ट्विक मुझे अन्य उत्तरों पर करना था केवल व्यूविलेडिसपियर में बार को अनहाइड करना है अगर यह गायब हो रहा है तो नेविगेशन आइटम को इस पर धकेलने के कारण। ऐसा इसलिए है क्योंकि दृश्य अन्य कारणों से गायब हो सकता है।

इसलिए मैं केवल बार को अनहाइड करता हूं यदि यह दृश्य अब शीर्ष दृश्य नहीं है:

- (void) viewWillDisappear:(BOOL)animated
{
    if (self.navigationController.topViewController != self)
    {
        [self.navigationController setNavigationBarHidden:NO animated:animated];
    }

    [super viewWillDisappear:animated];
}

3
+1, आप आमतौर पर मोडल डायलॉग को पुश करते समय नेविगेशन बार नहीं दिखाना चाहते हैं।
जोहो पोर्टेला

17

मैं में कोड डाल viewWillAppear दिखाया जा रहा है प्रत्येक दृश्य पर प्रतिनिधि:

इस तरह से जहाँ आपको इसे छिपाने की आवश्यकता है:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject hideBar];
}

इस तरह से जहां आपको इसे दिखाने की आवश्यकता है:

- (void)viewWillAppear:(BOOL)animated
{
        [yourObject showBar];
}

ली, अगर यह आपकी समस्या तय करता है, पाब्लो को "समाधान" उत्तर के रूप में चिह्नित करें।
रोज

2
इसके साथ एकमात्र समस्या यह है कि नेविगेशन बार "पॉप" करता है और देखने के रूप में आप एक दृश्य से अगले तक नेविगेट करते हैं। क्या यह संभव है कि पहली बार में नेविगेशन बार न हो, और जब दूसरा दृश्य जगह में स्लाइड हो, तो इसमें बिना किसी पॉपिंग के नौसैनिक बार हो?
हेनिंग

2
@ जब आप उम्मीद करेंगे वैसे ही नेवर स्लाइड को अंदर / बाहर करने के लिए, आपको setNavigationBarHidden का उपयोग करने की आवश्यकता है: डिफ़ॉल्ट:। नीचे एलन रोजर्स का उत्तर देखें (जिसे वास्तव में "समाधान" के रूप में चिह्नित किया जाना चाहिए)।
निक फोर्ज

2
यह उत्तर थोड़ा गलत है (viewWill / DidAppear) को सुपर कॉलिंग होना चाहिए। इसके अलावा एक समाधान के लिए मेरा जवाब नीचे देखें, जहां आपको इसे देखने के लिए नियंत्रक से जोड़ने की आवश्यकता नहीं है।
एलन रोजर्स

15

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

इसके बजाय, @Chad एम। का उपयोग करने की रणनीतिUINavigationControllerDelegate एक अच्छा है, और यहां एक पूर्ण समाधान है। कदम:

  1. उपवर्ग UINavigationController
  2. -navigationController:willShowViewController:animatedनेविगेशन पट्टी को दिखाने या छिपाने के लिए विधि को लागू करें कि क्या यह रूट दृश्य नियंत्रक दिखा रहा है
  3. UINavigationController उपवर्ग को अपने प्रतिनिधि के रूप में सेट करने के लिए आरंभीकरण के तरीकों को ओवरराइड करें

इस समाधान के लिए पूरा कोड में पाया जा सकता इस सार । यहाँ navigationController:willShowViewController:animatedकार्यान्वयन है:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    /* Hide navigation bar if root controller */
    if ([viewController isEqual:[self.viewControllers firstObject]]) {
        [self setNavigationBarHidden:YES animated:animated];
    } else {
        [self setNavigationBarHidden:NO animated:animated];
    }
}

2
यह स्वीकार किए गए एक से अधिक उपयुक्त उत्तर है
पावेल गुआरोव

14

स्विफ्ट 3 में:

override func viewWillAppear(_ animated: Bool) {
    navigationController?.navigationBar.isHidden = true
    super.viewWillAppear(animated)
}


override func viewWillDisappear(_ animated: Bool) {
    if (navigationController?.topViewController != self) {
        navigationController?.navigationBar.isHidden = false
    }
    super.viewWillDisappear(animated)
}

क्या आप बता सकते हैं कि आप स्वयं के लिए जाँच क्यों करते हैं? = स्व।
किट्सन

2
@ किटसन, user486646 के उत्तर की जांच करें: दूसरे उत्तरों पर मुझे जो एक छोटा सा ट्वीक करना था, वह केवल व्यूविलेस्पेयर में बार को अनहाइड करना है यदि कारण गायब हो रहा है तो नेविगेशन आइटम द्वारा उस पर धकेले जाने के कारण है। ऐसा इसलिए है क्योंकि दृश्य अन्य कारणों से गायब हो सकता है। इसलिए मैं केवल बार को
अनहाइड करता हूं

ऐसा लगता है कि यदि आप इसका उपयोग करते हैं तो navcontroller.navagationBarHiddenयह संपूर्ण नेविगेशन कंट्रोलर को तोड़ देगा (आगे-पीछे नहीं घूमना)। इसे काम पर लाने के लिए मैंने navigationController?.navigationBar.hiddenइसके बजाय उपयोग किया। स्वाइप करना फिर भी काम करता है और यह खाली जगह नहीं छोड़ता क्योंकि यह स्टैकव्यू या किसी चीज़ के अंदर लगता है
Sirens

8

मेरा श्रेय @ चाड-मी के जवाब को दें।

यहाँ स्विफ्ट संस्करण है:

  1. एक नई फ़ाइल बनाएँ MyNavigationController.swift

import UIKit

class MyNavigationController: UINavigationController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if viewController == self.viewControllers.first {
            self.setNavigationBarHidden(true, animated: animated)
        } else {
            self.setNavigationBarHidden(false, animated: animated)
        }
    }

}
  1. StoryBoard में अपने UINavigationController की क्लास को MyNavigationController पर सेट करें बस !MyNavigationController

चाड-एम के जवाब और मेरा के बीच अंतर:

  1. UINavigationController से प्रवेश करें, ताकि आप अपने rootViewController को प्रदूषित न करें।

  2. self.viewControllers.firstइसके बजाय का उपयोग करें homeViewController, इसलिए आप अपने StoryBoard में अपने 100 UINavigationControllers के लिए यह 100 बार नहीं करेंगे।


सोचिये यह सबसे साफ जवाब है। धन्यवाद
Dasilva

6

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

यह है कि मैं इसे कैसे काम कर रहा हूं।

चरण 1 - मेरे पास एक छवि है और उपयोगकर्ता उस छवि पर एक बार टैप करता है। मैं उस इशारे को पकड़ता हूं और उसे नए में धकेलता हूं imageViewController, उसके अंदर imageViewController, मैं फुल स्क्रीन इमेज लेना चाहता हूं।

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {  
NSLog(@"Single tap");
ImageViewController *imageViewController =
[[ImageViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];

godImageViewController.imgName  = // pass the image.
godImageViewController.hidesBottomBarWhenPushed=YES;// This is important to note. 

[self.navigationController pushViewController:godImageViewController animated:YES];
// If I remove the line below, then I get this error. [CALayer retain]: message sent to deallocated instance . 
// [godImageViewController release];
} 

चरण 2 - ये सभी चरण नीचे ImageViewController में हैं

चरण 2.1 - ViewDidLoad में, नावबार दिखाएं

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"viewDidLoad");
[[self navigationController] setNavigationBarHidden:NO animated:YES];
}

चरण 2.2 - में viewDidAppear, देरी के साथ एक टाइमर कार्य सेट करें (मैंने इसे 1 सेकंड देरी के लिए सेट किया है)। और देरी के बाद, लुप्त होती प्रभाव जोड़ें। लुप्त होती का उपयोग करने के लिए मैं अल्फा का उपयोग कर रहा हूं।

- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear");

myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(fadeScreen) userInfo:nil repeats:NO];
}

- (void)fadeScreen
{
[UIView beginAnimations:nil context:nil]; // begins animation block
[UIView setAnimationDuration:1.95];        // sets animation duration
self.navigationController.navigationBar.alpha = 0.0;       // Fades the alpha channel of   this view to "0.0" over the animationDuration of "0.75" seconds
[UIView commitAnimations];   // commits the animation block.  This Block is done.
}

स्टेप 2.3 - अंडर viewWillAppear, इमेज में सिंगलटैप जेस्चर जोड़ें और नेवर ट्रांसलेंट करें।

- (void) viewWillAppear:(BOOL)animated
{

NSLog(@"viewWillAppear");


NSString *path = [[NSBundle mainBundle] pathForResource:self.imgName ofType:@"png"];

UIImage *theImage = [UIImage imageWithContentsOfFile:path];

self.imgView.image = theImage;

// add tap gestures 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];  
[self.imgView addGestureRecognizer:singleTap];  
[singleTap release];  

// to make the image go full screen
self.navigationController.navigationBar.translucent=YES;
}

- (void)handleTap:(UIGestureRecognizer *)gestureRecognizer 
{ 
 NSLog(@"Handle Single tap");
 [self finishedFading];
  // fade again. You can choose to skip this can add a bool, if you want to fade again when user taps again. 
 myTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self  selector:@selector(fadeScreen) userInfo:nil repeats:NO];
 }

चरण 3 - अंत में viewWillDisappear, सभी सामान वापस डालना सुनिश्चित करें

- (void)viewWillDisappear: (BOOL)animated 
{ 
self.hidesBottomBarWhenPushed = NO; 
self.navigationController.navigationBar.translucent=NO;

if (self.navigationController.topViewController != self)
{
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}

[super viewWillDisappear:animated];
}

4

यदि किसी को अभी भी तेज़ बैकस्वाइस रद्द बग से परेशानी हो रही है तो @fabb ने स्वीकृत उत्तर में टिप्पणी की।

मैं अधिभावी इसका समाधान करने में प्रबंधन viewDidLayoutSubviews, के अलावा viewWillAppear/viewWillDisappearके रूप में नीचे दिखाया गया है:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

//*** This is required to fix navigation bar forever disappear on fast backswipe bug.
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.setNavigationBarHidden(false, animated: false)
}

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

हालाँकि, यह बग तब नहीं होता है जब दोनों दृश्य नियंत्रकों की स्थिति पट्टी शैलियाँ समान होती हैं।


1

यदि आप चाहते हैं कि नेविगेशन बार को पूरी तरह से कंट्रोलर में छिपा दिया जाए, तो रूट कंट्रोलर में एक बहुत क्लीनर सॉल्यूशन है, कुछ इस तरह है:

@implementation MainViewController
- (void)viewDidLoad {
    self.navigationController.navigationBarHidden=YES;
    //...extra code on view load  
}

जब आप नियंत्रक में एक बच्चे के दृश्य को धक्का देते हैं, तो नेविगेशन बार छिपा रहेगा; यदि आप इसे केवल बच्चे में प्रदर्शित करना चाहते हैं, तो आप कॉलबैक it(self.navigationController.navigationBarHidden=NO;)में प्रदर्शित करने के लिए कोड जोड़ देंगे viewWillAppear, और इसी तरह कोड को दिखाने के लिएviewWillDisappear


0

सबसे सरल कार्यान्वयन केवल प्रत्येक दृश्य नियंत्रक को निर्दिष्ट करना हो सकता है कि उसका नेविगेशन बार छिपा हुआ है या नहीं viewWillAppear:animated:। टूलबार को छुपाने / दिखाने के लिए भी यही तरीका अच्छा है:

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setToolbarHidden:YES/NO animated:animated];
    [super viewWillAppear:animated];
}

वास्तव में, मेरा सुझाव केवल टूलबार के लिए समझ में आता है, क्योंकि नेविगेशन बार को बिना किसी कॉल के दिखाने के लिए छिपाने के बाद यह उपयोगकर्ताओं को वर्तमान दृश्य से वापस नेविगेट करने में असमर्थ छोड़ देगा।
स्टीवकेन

0

केवल पहले पृष्ठ पर ही नेविगेशन बार को छुपाना स्टोरीबोर्ड के माध्यम से प्राप्त किया जा सकता है। स्टोरीबोर्ड पर, गोटो नेविगेशन नियंत्रक दृश्य-> नेविगेशन बार । और गुण निरीक्षक से ' हिडन ' संपत्ति का चयन करें । यह नेविगेशन बार को पहले व्यूकंट्रोलर से शुरू करेगा, जब तक कि यह आवश्यक व्यूकंट्रोलर के लिए दृश्यमान न हो जाए।

नेविगेशन बार ViewController के ViewWillAppear कॉलबैक में दिखाई देने के लिए सेट किया जा सकता है।

-(void)viewWillAppear:(BOOL)animated {

    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [super viewWillAppear:animated];                                                  
}

0

स्विफ्ट 4:

व्यू कंट्रोलर में आप नेविगेशन बार को छिपाना चाहते हैं।

override func viewWillAppear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
    super.viewWillAppear(animated)
}

override func viewWillDisappear(_ animated: Bool) {
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
    super.viewWillDisappear(animated)
}

-1

इस कोड को अपने ViewController में लागू करके आप इस प्रभाव को प्राप्त कर सकते हैं वास्तव में चाल है, जब नेविगेशन लॉन्च किया जाता है, तो उस नियंत्रक को छिपाएं

- (void)viewWillAppear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [super viewWillAppear:animated];
}

और जब उपयोगकर्ता उस पृष्ठ को छोड़ता है तो नेविगेशन बार को खोल दें

- (void)viewWillDisappear:(BOOL)animated {
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [super viewWillDisappear:animated];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.