ios - आईफोन ने केवल प्रथम पृष्ठ पर नेविगेशन बार छुपाया




uinavigationcontroller hide (10)

अगर किसी को अभी भी फास्ट बैकस्वाइप के साथ परेशानी हो रही है तो @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)
}

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

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

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

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

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

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

- (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];
}

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

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

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

    [super viewWillDisappear:animated];
}

मैं कोड को प्रत्येक दृश्य पर दृश्य विल्लएपियर प्रतिनिधि को दिखाऊंगा :

इस तरह आपको इसे छिपाने की जरूरत है:

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

इस तरह आपको इसे दिखाने की ज़रूरत है:

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

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

उद्देश्य सी

- (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 को स्टैक पर दबाते हैं, तो बाएं बटन (साथ ही पुराने दृश्य के साथ) को एनिमेट करते समय नेविगेशन बार को बाएं से ( UIViewController व्यू के साथ) एनिमेट करने का कारण बनता है, जब आप बैक बटन दबाते हैं UINavigationBar

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


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

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

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


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

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

  1. Subclass UINavigationController
  2. -navigationController:willShowViewController:animated कार्यान्वित करें -navigationController:willShowViewController:animated नेविगेशन बार को दिखाने या छिपाने के लिए -navigationController:willShowViewController:animated विधि, चाहे वह रूट व्यू कंट्रोलर दिखा रहा हो
  3. UINavigationController subclass को अपने प्रतिनिधि के रूप में सेट करने के लिए प्रारंभिक विधियों को ओवरराइड करें

इस समाधान के लिए पूरा कोड इस जिस्ट में पाया जा सकता है। यहां 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];
    }
}

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

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

स्विफ्ट 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)
}

स्विफ्ट 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)
}






hide