/ / UINavigationBar के ऊपर कस्टम स्थिति पट्टी - ios, उद्देश्य-सी, स्विफ्ट

UINavigationBar के ऊपर कस्टम स्टेटस बार - आईओएस, उद्देश्य-सी, स्विफ्ट

मैं ऊपर एक कस्टम 20px "स्टेटस बार" जोड़ रहा हूँयूआईएनविगेशनबार। जब उपयोगकर्ता रिफ्रेश करने के लिए खींचता है तो स्टेटस बार एक "रीफ्रेशिंग..." लेबल दिखाएगा। सामान्य ऑपरेशन में, डिफ़ॉल्ट स्थिति पट्टी दिखाई देगी, फिर मैं कॉल करता हूँ setStatusBarHidden:withAnimation: डिफ़ॉल्ट स्थिति पट्टी को फीका करने के लिए और उसके पीछे कस्टम स्थिति पट्टी प्रकट करने के लिए।

मेरी समस्या यह है कि जब मैं डिफ़ॉल्ट स्टेटस बार छुपाता हूं, तो नेविगेशन बार 20px ऊपर जाता है और कस्टम स्टेटस बार को ओवरलैप करता है!

क्या UINavigationBar को उसी स्थान पर रहने के लिए बाध्य करने का कोई तरीका है?

उत्तर:

उत्तर № 1 के लिए 1

ठीक है! तो समाधान (जैसा कि रयान ने सुझाव दिया था) एक UIWindow और सेट बना रहा था:

self.overlayWindow.windowLevel = UIWindowLevelStatusBar;

यह एक विंडो बनाता है जो स्टेटस बार के ऊपर बैठता है। मुझे एहसास नहीं हुआ कि आपके पास एक ही समय में कई UIWindows दिखा सकते हैं। यह एक अविश्वसनीय रूप से सुरुचिपूर्ण समाधान है।

कुछ गोत्र:

  • सेट self.overlayWindow.hidden = NO. नई विंडो डिफ़ॉल्ट रूप से छिपी हुई हैं।
  • आप ऐसा न करें नई विंडो के लिए रूट व्यू कंट्रोलर सेट करने की आवश्यकता है।
  • आप ऐसा न करें फोन करने की जरूरत है makeKeyAndVisible... स्थापना self.overlayWindow.hidden = NO पर्याप्त है।
  • आप जोड़ सकते हो UIView को सीधे साक्षात्कार UIWindow.
  • आपको एक मजबूत संदर्भ रखना चाहिए self.overlayWindow. अगर यह जारी हो जाता है, तो UIWindow गायब हो जाएगा (चूंकि इसे सबव्यू के रूप में नहीं जोड़ा गया है या कहीं और रखा गया है):

    @property (nonatomic, strong) UIWindow *overlayWindow;
    
  • रोटेशन के लिए अनुकूलन करने में थोड़ा अतिरिक्त काम लग सकता है।

मैंने थोड़ा मज़ा किया और एक वर्ग बनाया जो उपवर्गित था UIWindow और सेटअप को इनकैप्सुलेट किया। स्विफ्ट में:

class StatusBarOverlay: UIWindow {

init(frame: CGRect) {
super.init(frame: frame)

self.windowLevel = UIWindowLevelStatusBar
self.hidden = false
self.userInteractionEnabled = false
}
}