परिचय: यह अभिशप्त रेखा डेवलपर्स को क्यों नहीं सोने देती?
\n\nयदि आपने कभी Apple Music या Telegram जैसा ऐप डिज़ाइन बनाने की कोशिश की है, तो आप निश्चित रूप से इससे जूझ चुके हैं। आप एक आदर्श UINavigationBar बनाते हैं जिसमें सुंदर ग्रेडिएंट, पारदर्शिता या कस्टम रंग होता है, सिम्युलेटर चलाते हैं — और नीचे एक पतली ग्रे या काली रेखा (1 पिक्सेल) दिखाई देती है। यह एक आर्टिफैक्ट की तरह दिखती है, जैसे कांच पर गंदगी। और हाँ, यह गुस्सा दिलाती है।
यह 1px रेखा कोई बग नहीं, बल्कि एक फीचर है। यह shadowImage + backgroundImage है, जिसे Apple ने डिफ़ॉल्ट रूप से छोड़ दिया है। iOS 17 में भी यह तब तक दिखाई देती है जब तक आप सिस्टम से नहीं कहते: "अरे, इसे हटाओ।" Stack Overflow पर इस विषय पर प्रश्न को हज़ारों व्यूज़ और दर्जनों उत्तर मिले हैं। इसका मतलब है कि यह विषय वास्तव में परेशान करने वाला है।
\n\nइस लेख में मैं Swift में UINavigationBar की निचली रेखा को छिपाने के 3 कार्यशील तरीके दिखाऊंगा। हम पुराने तरीकों (iOS 13-) और UINavigationBarAppearance के माध्यम से आधुनिक तरीकों दोनों पर चर्चा करेंगे। चलिए शुरू करते हैं!
तरीका 1: क्लासिक — backgroundImage और shadowImage के माध्यम से
\n\nसबसे पुराना और सिद्ध तरीका। यह iOS 5 से काम करता है (हाँ, उस समय से जब स्केवोमॉर्फिज़्म फैशन में था)। विचार सरल है: हम पृष्ठभूमि और छाया के रूप में एक खाली छवि सेट करते हैं।
\n\nचरण 1: एक खाली छवि बनाएं
\n\nextension UIImage {\n static func pixelImage(withColor color: UIColor = .clear) -> UIImage {\n let rect = CGRect(x: 0, y: 0, width: 1, height: 1)\n UIGraphicsBeginImageContext(rect.size)\n color.setFill()\n UIRectFill(rect)\n let image = UIGraphicsGetImageFromCurrentImageContext()\n UIGraphicsEndImageContext()\n return image ?? UIImage()\n }\n}\n\nचरण 2: navigationBar पर लागू करें
\n\nfunc hideBottomLine() {\n let emptyImage = UIImage.pixelImage()\n navigationController?.navigationBar.setBackgroundImage(emptyImage, for: .default)\n navigationController?.navigationBar.shadowImage = emptyImage\n}\n\nलाभ: पुराने iOS पर भी हर जगह काम करता है।
\nनुकसान: scrollEdgeAppearance और बड़े शीर्षकों के साथ हमेशा सही ढंग से काम नहीं करता। यदि आपके पास UISearchBar है — तो रेखा वापस आ सकती है।
तरीका 2: आधुनिक — UINavigationBarAppearance के माध्यम से (iOS 13+)
\n\niOS 13 से शुरू करके Apple ने UINavigationBarAppearance पेश किया। यह एक एकल ऑब्जेक्ट है जो सभी अवस्थाओं को नियंत्रित करता है: मानक, स्क्रॉल और कॉम्पैक्ट। उन लोगों के लिए आदर्श जो "एक बार सेट करो और भूल जाओ" चाहते हैं।
UIViewController के लिए पूरा उदाहरण
\n\nfunc setupTransparentNavigationBar() {\n let appearance = UINavigationBarAppearance()\n appearance.configureWithTransparentBackground()\n appearance.backgroundColor = .clear\n appearance.shadowColor = .clear // रेखा हटाता है\n \n navigationController?.navigationBar.standardAppearance = appearance\n navigationController?.navigationBar.scrollEdgeAppearance = appearance\n navigationController?.navigationBar.compactAppearance = appearance\n}\n\nध्यान दें: shadowColor = .clear — यह मुख्य पंक्ति है। यदि यह नहीं लिखा गया, तो रेखा बनी रहेगी। configureWithTransparentBackground() पृष्ठभूमि को पारदर्शी बनाता है, लेकिन छाया को नहीं छूता।
यदि आपको रंगीन पृष्ठभूमि चाहिए, लेकिन रेखा के बिना:
\n\nlet appearance = UINavigationBarAppearance()\nappearance.configureWithOpaqueBackground()\nappearance.backgroundColor = .systemBlue\nappearance.shadowColor = .clear\n\nnavigationController?.navigationBar.standardAppearance = appearance\nnavigationController?.navigationBar.scrollEdgeAppearance = appearance\n\nलाभ: साफ कोड, बड़े शीर्षकों और खोज के साथ आसानी से संयोजित होता है।
\nनुकसान: केवल iOS 13+। यदि प्रोजेक्ट iOS 12 को सपोर्ट करता है — तो आपको