IOS 11 पर स्क्रॉल किए बिना नेविगेशन बार में खोज बार दिखाएं


80

मैं navigationItem.searchControlleriOS 11 पर एक UITableViewController की संपत्ति के लिए एक UISearchController संलग्न कर रहा हूं । यह ठीक काम करता है: मैं अच्छा iOS 11-शैली खोज बार का उपयोग कर सकता हूं।

हालाँकि, मैं खोज बार को लॉन्च पर दिखाई देना चाहूंगा। डिफ़ॉल्ट रूप से, उपयोगकर्ता को खोज बार देखने के लिए तालिका दृश्य में स्क्रॉल करना होगा। क्या किसी को पता है कि यह कैसे संभव है?

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

छोड़ दिया: लॉन्च के बाद डिफ़ॉल्ट स्थिति। राइट: सर्च बार दृश्यमान (ऊपर स्क्रॉल करके) दिखाई देता है। मैं लॉन्च के बाद खोज बार को सही स्क्रीनशॉट में देखना चाहता हूं।

मैंने पहले ही पाया कि hidesSearchBarWhenScrollingमेरे नेविगेशन आइटम की संपत्ति को झूठी करने के लिए खोज बार को दृश्यमान बनाया जा सकता है । हालाँकि, यह खोज बार हमेशा दिखाई देने का कारण बनता है - यहां तक ​​कि नीचे स्क्रॉल करते समय -, जो कि मैं नहीं चाहता।


जहाँ आपने कोड जोड़ाhidesSearchBarWhenScrolling
Anbu.Karthik

1
इसे एस के रूप में स्थापित करने के बारे में क्या firstResponder?
मिलन नोसै

2
नीचे चयनित जवाब मेरे लिए लोड पर काम करता है, लेकिन मैं प्रोग्राम कंट्रोलर को फिर से प्रदर्शित करना चाहूंगा जब प्रोग्रामेटिक रूप से शीर्ष पर स्क्रॉल कर रहा हो scrollView.setContentOffset(_:animated)। किसी के पास एक सुझाव है?
जस्टिन वेल्ली

@ जोनाथन hidesSearchBarWhenScrolling = falseआईओएस में बड़े टाइटल पर सर्च बार डालता है। कोई भी विचार अगर मैं इसे किसी तरह अपडेट कर सकता हूं?
Bonnke

जवाबों:


187

निम्नलिखित खोज बार को पहले दिखाई देता है, फिर इसे स्क्रॉल करने पर छिपाने की अनुमति देता है:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

का उपयोग करते हुए isActiveमैं क्या चाहता था, यह खोज पट्टी को सक्रिय करता है (रद्द बटन दिखा रहा है, आदि), जब मैं चाहता हूं कि यह दिखाई दे।


धन्यवाद, मेरे लिए काम किया। दिलचस्प समाधान हालांकि :)
मिक्रिया

9
यह समाधान काम करता है, लेकिन इसके साइड इफेक्ट्स हैं अगर आप पहले भी एक नेविगेशन बार प्रदर्शित कर रहे हैं यदि यह पहले छिपा हुआ था (यानी नेविगेशन स्टैक पर इस दृश्य w / खोज बार को धक्का दे रहा है) खोज बार नेविगेशन बार के रूप में स्थिर दिखाई देगा। भयानक लगता है :(
मैथ्यू Crenshaw

12
यदि आप viewDidLoadइसके बजाय पहला भाग नहीं रखते हैंviewWillAppear
मार्क-अलेक्जेंड्रे बेरुबे

1
क्या कोई इस बारे में विस्तार से बता सकता है कि यह काम क्यों करता है और देखने में क्यों searchController.searchBar.isHidden = false? उत्तरार्द्ध मेरे लिए कहीं अधिक तार्किक लगता है
pho_pho

5
यह बाल स्क्रीन से वापस जाने पर iOS 13 में दृश्य बग का कारण बनता है।
नीमस

5

आप संपत्ति सेट कर सकते हैं isActiveकरने के लिए trueकरने के लिए searchController जोड़ने के बाद navigationItem

सिर्फ इस तरह:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

कोई सेटर विधि 'setIsActive:'
निकोले

आप सही हैं, @NikolayKrasnov। isActiveकेवल पढ़ने के लिए बूलियन है। आप searchController.active = trueइसके बजाय उपयोग करना चाहेंगे ।
मार्क जेसके

2

मेरे लिए यह viewDidLoad()विधि में निम्नलिखित पंक्तियों को जोड़ने के बाद काम किया :

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

0

IOS 13 पर, @ जोर्डन वुड का जवाब काम नहीं आया। इसके बजाय मैंने किया:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.