iPhone: डिफ़ॉल्ट रूप से UITableView खोज बार छुपाएं


85

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

मैं जानना चाहता हूं कि खोज पट्टी को डिफ़ॉल्ट रूप से कैसे छिपाया जा सकता है लेकिन फिर भी तालिका दृश्य के साथ स्क्रॉल किया जा सकता है (उदाहरण के लिए Apple का मेल एप्लिकेशन देखें)। मैं बुला की कोशिश की है scrollRectToVisible:animated:में viewDidLoadतालिका दृश्य नीचे स्क्रॉल करने के लिए, लेकिन कोई लाभ नहीं हुआ। डिफ़ॉल्ट रूप से खोज बार को छिपाने का पसंदीदा तरीका क्या है?

जवाबों:


116

पहले सुनिश्चित करें, UISearchBar को UITableView के tableHeaderView में जोड़ने के लिए ताकि यह तालिका की सामग्री के साथ स्क्रॉल हो जाए और दृश्य के शीर्ष पर स्थिर न हो।

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

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

या स्विफ्ट में:

yourTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: UITableViewScrollPosition.Top, animated: false)

यह सुनिश्चित करें कि डेटा होने से पहले टेबलव्यू को स्क्रॉल न करें ( scrollToRowAtIndexPathयदि अपवाद दिए गए इंडेक्सपथ एक वैध पंक्ति को इंगित नहीं करता है (यानी यदि टेबलव्यू खाली है))।


12
वास्तव में, मुझे एक मुद्दा मिल रहा है जहां तालिका दृश्य स्क्रॉल नहीं करेगा यदि स्क्रीन को भरने के लिए पर्याप्त पंक्तियां नहीं हैं - एक या दो पंक्तियों वाली तालिका में, यह कोड कुछ भी नहीं करता है। क्या वह अपेक्षित व्यवहार है? क्या मैं किसी तरह इसके आसपास पहुंच सकता हूं?
टिम

18
मुझे एक रास्ता मिला: एक सूचकांक पथ पर स्क्रॉल करने के बजाय, तालिका के स्क्रॉल दृश्य की सामग्री ऑफसेट को CGRect पर 0.0, 44.0
Tim

107
टिम, यह रास्ता तय करना है! मैंने self.tableView.contentOffset = CGPointMake (0, self.searchDisplayController.searchBar.frame.size.height) का उपयोग किया;
जो डी'एंड्रिया

1
Btw - जब मैं [tableView reloadData] के कॉल के बाद इस कोड में डाल रहा था, जिसके कारण मेरी तालिका सामान्य स्क्रॉलिंग की अनुमति देने के लिए 2 पंक्तियों से पर्याप्त पंक्तियों तक गई, तो मैंने पाया कि सामग्री का उपयोग करने की विधि ने झटके दिखाने और खोज को छिपाने का कारण बना स्क्रॉलटॉ रॉटएंडएंडएक्सपैथ विधि का उपयोग करते समय बॉक्स में एक ही झटका नहीं था।
क्रिस आर

1
यह एकमात्र अंतिम तरीका है जो किसी भी परिस्थिति में काम करता है। contentOffsetयदि आप जटिल दृश्य-नियंत्रक लेआउट को नियोजित कर रहे हैं तो जो भी मूल्य होगा, उसके साथ सेटिंग करना । मैं इसकी अनुशंसा नहीं करता।
3

45

UISearchBar को UITableView के उप-भाग के रूप में न जोड़ें, यह आवश्यक नहीं है।

UITableView के पास एक TableHeaderView संपत्ति है जो इसके लिए एकदम सही है:

- (void) viewDidLoad {
    [super viewDidLoad]; 
    self.searchBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
    self.searchBar.showsCancelButton = YES;    
    self.searchBar.delegate = self;
    self.tableView.tableHeaderView = self.searchBar;     
}

यदि आप इसे डिफ़ॉल्ट रूप से नहीं देखना चाहते हैं:

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView setContentOffset:CGPointMake(0, 44)];
}

मुझे इसे फिर से छिपाने के लिए रद्द बटन भी मिलता है .... (और कीबोर्ड को हटा दें)

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [self.tableView setContentOffset:CGPointMake(0, 44) animated:YES];
    [self.searchBar resignFirstResponder];
}

मेरे लिए, यह एकमात्र समाधान था जिसने एक छिपे हुए UISearchBar कार्यान्वयन का उत्पादन किया जो ऐसा महसूस करता था कि यह HIG के साथ इन-लाइन था। अन्य समाधान जहां यह तालिका के शीर्ष पर "अटक" है अप्राकृतिक लगता है।
कर्ट्ज़मार्क

1
इस समाधान ने सबसे अच्छा काम किया। मेरी राय में इसका जवाब होना चाहिए।
darwindeeds 16

यह समाधान अच्छा (+1) है। हालाँकि, टेबल व्यू कुछ मामलों में (मेरे मामले में: जब टेबलव्यू कंट्रोलर को दूसरे व्यू कंट्रोलर से पीछे धकेला जाता है) ठीक से सर्च बार को छिपा नहीं पाता है। इस मुद्दे के बारे में एक सवाल है: stackoverflow.com/questions/15222186/… मुझे लगता है कि इस सवाल का प्रदान किया गया उत्तर हालांकि बहुत अच्छा नहीं है। @bandejapaisa, क्या आपको कोई आइडिया है?
ब्रायन

3
मेरे लिए यह अच्छी तरह से काम किया है, हालांकि हार्ड-कोडिंग 44 के बजाय मैं स्वयं का उपयोग करने का सुझाव देता हूं। आत्मनिर्भरता का उपयोग करने का सुझाव देता हूं।
जॉन स्टीफन

इसे डालना viewWillAppearएक बुरा विचार है क्योंकि यह आपके द्वारा अपने दृश्य पर वापस नेविगेट करने पर हर बार चलेगा। इसका मतलब है कि आपका टेबलव्यू धीरे-धीरे नीचे आएगा। चिड़चिड़ाहट बग!
सायरन

25

कन्टैंटऑफ़सेट को टिम और जो डी'आंड्रिया द्वारा टिप्पणियों में नोट किया गया था, लेकिन यह खोज पट्टी को छिपाने के लिए एक एनीमेशन जोड़कर थोड़ा विस्तारित है। मैंने देखा कि खोज पट्टी के लिए बस गायब होना थोड़ा अप्रत्याशित है।

जो लोग iOS 4.0 और इसके बाद के संस्करण को लक्षित करना चाहते हैं, उनके लिए थोड़ा सा अपडेट यह प्रयास करें:

[UIView animateWithDuration:0.4 animations:^{
    self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);
 } completion:nil];

पिछला उत्तर:

[UIView beginAnimations:@"hidesearchbar" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];

self.tableView.contentOffset = CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height);

[UIView commitAnimations];


9
मैंने पाया है कि एनीमेशन इस समाधान की कुंजी है। एनीमेशन के बिना सामग्री ऑफसेट सेट करने की कोशिश करने से कुछ नहीं होगा। इस नमूने में एनीमेशन विधियों (या ब्लॉक) का उपयोग करने के बजाय, मुझे लगता है कि बस [self.tableView setContentOffset: CGPointMake (0,44) एनिमेटेड: TRUE] को कॉल करना काफी अच्छा काम करता है।
Quickthyme

यह एनीमेशन के बिना बिल्कुल भी काम नहीं करता है। @quickthyme ने एक ही अवलोकन किया है।
थिलो

5
यदि आप viewDidAppear:इसके बजाय इसे लागू करते हैं, तो मुझे एनिमेशन की आवश्यकता के बिना इसके साथ सफलता मिली है viewDidLoad
wbyoung

8

इस समाधान के कई उत्तर हैं, हालांकि किसी ने भी मेरे लिए बहुत अच्छा काम नहीं किया है।

यह पूरी तरह से काम करता है। कोई एनीमेशन नहीं है, और किया जाता है-viewDidLoad

 - (void)viewDidLoad {
     [super viewDidLoad];
     self.tableView.contentOffset = CGPointMake(0,  self.searchBar.frame.size.height - self.tableView.contentOffset.y);
 }

ध्यान दें:

कोड मानता है कि आपके पास searchBar @propertyखोज बार से जुड़ा हुआ है। यदि नहीं, तो आप self.searchDisplayController.searchBarइसके बजाय उपयोग कर सकते हैं


यह केवल एक ही है जो मेरे लिए काम करता है! , लेकिन यह केवल इसे देखने के लिए संयुक्त राष्ट्र करता है ... तो पहली बार अपनी hiden, लेकिन तब deiden नहीं है जबकि डे ऐप चल रहा है। और मैंने इसे viewwillappear और viewdidappear में डालने की कोशिश की लेकिन गलत काम करता है। धन्यवाद!
fguespe

@fguespe यह अजीब है .. दृश्य को हर बार देखने के लिए तुरंत बुलाया जाना चाहिए। मेरे साथ ऐसा कभी नहीं हुआ कि UISearchBar किसी अन्य दृश्य से वापस आने के बाद दिखाई दे।
मेटेज

टैब्ड एप्लिकेशन का उपयोग करके im। वह हो सकता है?
23

@fguespe मैं देख रहा हूं कि यह मुद्दा हम्म हो सकता है। दुर्भाग्य से यह सुनिश्चित नहीं है कि आप इसे हल करने के बारे में कैसे -viewWillAppearकाम करेंगे अगर यह काम नहीं करता है .. क्या यह तब प्राप्त होता है जब टैब नियंत्रक दृश्य पर स्विच करता है?
Matej

viewwillappear और viewdidappear कहा जाता है, लेकिन मैंने दोनों के साथ प्रयास किया और दृश्य गलत ऑफसेट की तरह है। यह अपेक्षित परिणाम नहीं लौटाता है। मेरा मतलब है, कुछ करता है, लेकिन यह बुरा करता है।
fguespe

7

स्विफ्ट 3+ के लिए

इसे मैने किया है:

इसे घोषित करें var:

    var searchController = UISearchController()

और viewDidLoad()विधि में

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = true
    searchController.searchBar.placeholder = NSLocalizedString("Search", comment: "")
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)

5

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

extension UITableView {
    func hideSearchBar() {
        if let bar = self.tableHeaderView as? UISearchBar {
            let height = CGRectGetHeight(bar.frame)
            let offset = self.contentOffset.y
            if offset < height {
                self.contentOffset = CGPointMake(0, height)
            }
        }
    }
}

दृश्य में डिडलॉड () बस कॉल करें:

self.tableView.hideSearchBar()

5

सभी मौजूदा समाधान iOS 8 पर मेरे लिए काम नहीं करते हैं जब टेबल व्यू को भरने के लिए पर्याप्त पंक्तियाँ नहीं होती हैं क्योंकि iOS इस स्थिति में स्वचालित रूप से इनसेट को समायोजित करेगा। (मौजूदा जवाब अच्छे हैं जब पर्याप्त पंक्तियाँ हैं)

इस मुद्दे पर 6 घंटे बर्बाद करने के बाद, मुझे आखिरकार यह समाधान मिल गया।

संक्षेप में, आपको पर्याप्त कक्ष नहीं होने पर तालिका में रिक्त कक्ष सम्मिलित करने की आवश्यकता होती है, इसलिए तालिका दृश्य की सामग्री आकार इतना बड़ा है कि iOS आपके लिए इनसेट समायोजित नहीं करेगा।

यहाँ मैं इसे स्विफ्ट में कैसे किया है:

1.) एक चर minimumCellNumको एक वर्ग संपत्ति के रूप में घोषित करें

var minimumCellNum: Int?

2.) की गणना minimumCellNumऔर सेट tableView.contentOffsetमेंviewWillAppear

let screenHeight = Int(UIScreen.mainScreen().bounds.height)

// 101 = Height of Status Bar(20) + Height of Navigation Bar(44) + Height of Tab Bar(49)
// you may need to subtract the height of other custom views from the screenHeight. For example, the height of your section headers.
self.minimumCellNum = (screenHeight - 103 - heightOfOtherCustomView) / heightOfYourCell
self.tableView.contentOffset = CGPointMake(0, 44)

3.) में tableView(tableView: UITableView, numberOfRowsInSection section: Int))

let numOfYourRows = YOUR LOGIC
if numOfYourRows > minimumCellNum {
    return numOfYourRows
} else {
    return minimumCellNum!
}

4.) एक खाली सेल को पंजीकृत करें, जिसकी selectionविशेषता Noneस्टोरीबोर्ड पर और में हैtableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)

if indexPath.row < numOfYourRows {
    return YOUR CUSTOM CELL
} else {
    let cell = tableView.dequeueReusableCellWithIdentifier("EmptyCell", forIndexPath: indexPath) as! UITableViewCell
    return cell
}

5.) में tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

if tableView == self.tableView {
    if numOfYourRows < (indexPath.row + 1) {
        return
    }
    YOUR LOGIC OF SELECTING A CELL
}

यह एक सही समाधान नहीं है, लेकिन यह एकमात्र समाधान है जो वास्तव में मेरे लिए iOS 8 पर काम करता है। मैं जानना चाहता हूं कि क्या कोई समाधान है।


मुझे यह iOS 11 के लिए करना था। कंटेंटऑफसेट सेट करना अकेले iOS 9/10 के लिए 0 या अधिक सेल के लिए काम करता था, और इसने 8+ कोशिकाओं के लिए iOS 11 पर भी काम किया। कुछ भी कम इस समाधान की आवश्यकता है। क्या कोई कारण है?
टोनी

मुझे लगता है कि इस पोस्ट का पहला पैराग्राफ बताता है कि क्यों।
ब्रायन

मैं पहले पैराग्राफ को समझ गया था, लेकिन यह अभी भी अजीब था कि यह केवल मेरे लिए iOS 11 पर "टूट गया" था। मैंने iOS 9, 10 और 11 के लिए समान व्यवहार की उम्मीद की होगी जब कोशिकाओं की संख्या समान होगी (पर्याप्त से कम)। धन्यवाद फिर से और एक पुरानी पोस्ट लाने के लिए खेद है!
टोनी

4

उपरोक्त में से कोई भी मेरे लिए काम नहीं करता है, इसलिए अगर किसी के पास एक ही मुद्दा होगा तो बस।

मैंने iOS7 पर एक समूहीकृत टेबल पर searchBarसेट किया है tableHeaderView। शुरू में viewDidLoadमुझे "छुपा" tableView.contentOffset = CGPointMake(0, 44);रखना होगा searchBar। जब उपयोगकर्ता नीचे स्क्रॉल करता searchBarहै dsiplayed

लक्ष्य: सर्चबेर को कैंसिल बटन टैप पर छुपाएं

में searchBarCancelButtonClicked(searchBar: UISearchBar!)

यह काम नहीं किया: [yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; tableView बहुत ऊपर स्क्रॉल कर रहा था, जिसके परिणामस्वरूप पंक्ति 0 टूलबार के पीछे जा रही थी।

यह काम नहीं किया: tableView.ContentOffset = CGPointMake(0, 44) - कुछ भी नहीं होता है

यह काम नहीं किया: tableView.ContentOffset = CGPointMake(0, searchBar.frame.size.height) - कुछ भी नहीं होता है

यह काम नहीं किया: tableView.setContentOffset(CGPointMake(0, 44), animated: true); फिर से tableView बहुत ऊपर स्क्रॉल कर रहा था, जिसके परिणामस्वरूप पंक्ति 0 टूलबार के पीछे जा रही थी।

यह आंशिक रूप से काम किया: tableView.setContentOffset(CGPointMake(0, 0) लेकिन titleForHeaderInSectionटूलबार के पीछे जा रहा था

यह काम किया: tableView.setContentOffset(CGPointMake(0, -20)

तर्कसंगत नहीं लगता, लेकिन केवल -20 ने इसे सही स्थिति में ले जाया


आपको वास्तव में अपने अंकों को हार्ड कोड नहीं करना चाहिए, आप इसका उपयोग क्यों नहीं करते हैं CGRectGetHeight(searchBar.bounds)?
जोरावर

मुझे लगता है कि आप इसे देखने में अवश्य कर रहे हैं। हो सकता है कि आप को देखने की कोशिश करनी
चाहिएडायलेटाउट साक्षात्कार

यदि TableView ने लोडिंग समाप्त नहीं की है, तो कोई भी ContentOffsetसमाधान काम नहीं करेगा
Maor

4

सामग्री ऑफ़सेट जाने का तरीका है, लेकिन यह समय के 100% काम नहीं करता है।

अगर यह estimatedRowHeightएक निश्चित संख्या में सेट हो रहा है तो यह काम नहीं करता है । मुझे अभी तक काम की जानकारी नहीं है। मैंने एक परियोजना बनाई है जो इस मुद्दे को दिखा रही है और मैंने Apple के साथ एक रडार बनाया है ।

यदि आप इसे कैसे सेट अप करना चाहते हैं, तो प्रोजेक्ट को देखें।


1
धन्यवाद! यही मैं ढूंढ रहा था। आपको ऊपर जाने की जरूरत है।
user2387149

3

ध्यान दें कि यदि तालिका में कोई डेटा नहीं है, तो स्वीकृत उत्तर क्रैश हो जाएगा। और इसे viewDidLoad में जोड़ना कुछ परिस्थितियों में काम नहीं कर सकता है।

[yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; // crashes if no rows/data

इसलिए, इस कोड को जोड़ने की बजाय:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [yourTableView setContentOffset:CGPointMake(0, self.searchDisplayController.searchBar.frame.size.height)];
}

2

ईमानदारी से, किसी भी उत्तर ने वास्तव में समस्या को हल नहीं किया (मेरे लिए)। यदि आपके तालिका दृश्य में कोई पंक्तियाँ नहीं हैं या पंक्ति ऊँचाई भिन्न है, तो ये उत्तर पर्याप्त नहीं हैं।

केवल एक चीज जो काम करती है:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.tableView.contentOffset = (CGPoint){.y =  self.tableView.contentOffset.y + self.searchController.searchBar.frame.size.height};
}

ऑफसेट समस्या के लिए अच्छा समाधान। UINavigationController का उपयोग करते समय मेरे लिए काम करता है।
एंड्रियास क्राफ्ट

1
जब पंक्तियों की संख्या पूरी स्क्रीन को कवर नहीं करती है तो समाधान काम नहीं करता है - क्या इसके लिए कोई समाधान ज्ञात होगा?
जोरायर

यकीन नहीं होता कि मैं इसे पूरी तरह से समझता हूं। यह मेरे लिए तब काम करता है जब मेरे पास तालिका में कुछ पंक्तियाँ होती हैं। हालांकि मैं निम्नलिखित का उपयोग करता हूं self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];:।
p0lAris

2

scrollToRowAtIndexPathअगर वहाँ तालिका में शून्य पंक्तियां हैं विधि एक दुर्घटना का कारण बनता है।

UITableView हालांकि एक स्क्रॉल दृश्य है, इसलिए आप केवल सामग्री ऑफसेट को बदल सकते हैं।

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

    if let searchHeight = tableView.tableHeaderView?.frame.height {
        tableView.setContentOffset(CGPoint.init(x: 0, y:searchHeight ), animated: false)
    }

1

मुझे पता चलता है कि टेबल व्यू खाली होने पर "नोट्स" ऐप आइटम खोजने में असमर्थ है। तो मुझे लगता है कि यह सिर्फ उपयोग कर रहा है-(void)addSubview:(UIView *)view पहली बार में एक खाली तालिका जोड़ने के लिए । जब आप किसी आइटम को उसके डेटा स्रोत सरणी में जोड़ते हैं, तो यह टेबल व्यू लोड करने के लिए एक और कोड ऑफ़ कोड चलाएगा।

तो मेरा समाधान है:

if([self.arrayList count] > 0)
{
     [self.tableView reloadData];     //use jdandrea's code to scroll view when cell==nil in cellForRowAtIndexPath
     self.tableView.scrollEnabled = YES;
}
else
{
     tableBlank = [[UITableView alloc]initWithFrame:CGRectMake(0,0,320,416) style:UITableViewStylePlain] autorelease];
     tableBlank.delegate = self;
     tableBlank.dataSource = self;
     [self.view addSubview:tableBlank];
}

उम्मीद है की यह मदद करेगा :-)


1

viewDidLoadतालिका दृश्य की सीमा बदलें, यह अंदर किया जा सकता है और साथ ही आपको इस बारे में चिंता करने की ज़रूरत नहीं है कि तालिका खाली है या नहीं (अपवाद से बचने के लिए)।

CGRect newBounds = self.tableView.bounds;
newBounds.origin.y = newBounds.origin.y + self.searchBar.bounds.size.height;
self.tableView.bounds = newBounds;

उपयोगकर्ता द्वारा तालिका को नीचे स्क्रॉल करने के बाद खोज बार दिखाई देगा और सामान्य रूप से व्यवहार करेगा


1

इस सवाल के अन्य उत्तर या तो मेरे लिए बिल्कुल भी काम नहीं करते थे, जब टेबल व्यू में 0 पंक्तियाँ होती थीं, तो अजीब व्यवहार होता था, या पेरेंट और नेस्टेड लाइन आइटम के बीच में आगे और पीछे स्क्रॉल करने की स्थिति गड़बड़ कर देती थी। इसने मेरे लिए काम किया (लोड होने पर UISearchBar को छिपाने का लक्ष्य):

public override func viewWillAppear(animated: Bool) {        
    if self.tableView.contentOffset.y == 0 {
        self.tableView.contentOffset = CGPoint(x: 0.0, y: self.searchBar.frame.size.height) 
    }
}

स्पष्टीकरण
कभी भी tableViewदिखाई देगा, इस कोड की जाँच करता देखने के लिए अगर UISearchBar दिख रहा है (जिसका अर्थ है yकी स्थिति contentOffset, उर्फ स्क्रॉल स्थिति, है 0)। यदि यह है, तो यह बस खोजबार की ऊंचाई को नीचे स्क्रॉल करता है। यदि सर्चबार दिखाई नहीं देता है (आइटमों की एक बड़ी सूची में सोचें tableView), तो यह कोशिश नहीं करेगा और स्क्रॉल करेगा tableView, क्योंकि इससे स्थिति तब खराब हो जाती है जब आप नेस्टेड लाइन आइटम से वापस आते हैं।

साइड नोट
मैं इस कोड को एकल जिम्मेदारी सुनिश्चित करने के लिए एक अलग विधि में डालने की सलाह दूंगा और आपको इसे अपने कोड में कभी भी कॉल करने की पुन: प्रयोज्यता प्रदान करेगा।


1

यदि आपकी तालिका में हमेशा कम से कम एक पंक्ति होगी, तो बस तालिका की पहली पंक्ति पर स्क्रॉल करें और खोज बार अपने आप छिप जाएगा।

let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)

self.tableView.selectRowAtIndexPath (firstIndexPath, एनिमेटेड: गलत, स्क्रॉलपोजिशन: टॉप)

यदि आप उपरोक्त कोड viewDidLoad पर डालते हैं , तो यह एक त्रुटि देगा क्योंकि तालिका दृश्य अभी तक लोड नहीं हुआ है, इसलिए आपको इसे viewDidAppear में रखना होगा क्योंकि इस बिंदु तक तालिका दृश्य पहले ही लोड हो चुकी है।

यदि आप इसे viewDidAppear पर रखते हैं , तो हर बार जब आप तालिका दृश्य खोलते हैं तो यह शीर्ष पर स्क्रॉल हो जाएगा।

हो सकता है कि आप यह व्यवहार नहीं चाहते हैं, यदि टेबल दृश्य खुला रहता है, जैसे कि यह UITabBar व्यू कंट्रोलर है या जब आप एक सेग करते हैं और फिर वापस आते हैं। यदि आप चाहते हैं कि यह प्रारंभिक लोड पर शीर्ष पर स्क्रॉल करें, तो आप यह जांचने के लिए एक चर बना सकते हैं कि क्या यह प्रारंभिक लोड है ताकि यह सिर्फ एक बार शीर्ष पर स्क्रॉल हो।

दृश्य नियंत्रक वर्ग में isInitialLoad नामक एक चर को परिभाषित करें और इसे "सही" के बराबर सेट करें।

var isInitialLoad = true

फिर देखें कि क्या IsInitialLoad viewDidAppear पर सत्य है और यदि यह सत्य है, तो शीर्ष पर स्क्रॉल करें और isInitialLoad चर को गलत पर सेट करें:

if isInitialLoad {
            let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)
            self.tableView.selectRowAtIndexPath(firstIndexPath, animated: false, scrollPosition: .Top)

            isInitialLoad = false
        }

1

नीचे कोड मेरे लिए काम कर रहा है

self.tableView.contentOffset = CGPointMake(0.0, 44.0);

1

मैंने कंटेंट ऑफ़सेट और स्क्रॉलटॉइंडएक्सपथ सेट करने की कोशिश की, लेकिन कुछ भी संतोषजनक ढंग से काम नहीं किया। मैंने खोज के रूप में tableHeaderView की सेटिंग हटा दी है और viewDidLoad से इसे नीचे दिए गए स्क्रॉलव्यू डेलीगेट में सेट करें

override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    if scrollView.contentOffset.y < 0 && tableView.tableHeaderView == nil {
        tableView.tableHeaderView = searchController.searchBar
        tableView.setContentOffset(CGPointMake(0, scrollView.contentOffset.y + searchController.searchBar.frame.size.height), animated: false)
    }
}

यह एक आकर्षण की तरह काम करता है। सामग्री ऑफसेट सेटिंग चिकनी स्क्रॉलिंग उद्देश्य के लिए है


0

स्टेटस बार और नेविगेशन बार को ध्यान में रखना मत भूलना । मेरा टेबल व्यू कंट्रोलर एक नेविगेशन कंट्रोलर में एम्बेडेड है, जिसमें viewDidAppear:

tableView.contentOffset = CGPointMake(0, -20) // -20 = 44 (search bar height) - 20 (status bar height) - 44 (navigation bar height)

मेरे लिए काम किया।


0

स्विफ्ट के लिए:

बस टेबलव्यू कंटेंट y ऑफसेट करें, जो सर्चबार की ऊंचाई की तरह होना चाहिए।

self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height)

0

स्विफ्ट 3

खाली टेबल के साथ भी काम करता है!

मेरे वातावरण में मैं xib फ़ाइल द्वारा कस्टम सेल लोड करता हूं और रो हाइट स्वचालित सेट है।

    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        self.tableView.contentOffset = CGPoint(x: 0, y: self.tableView.contentOffset.y + self.searchController.searchBar.bounds.height)
}

0

मुझे भी ऐसी ही समस्या थी। और इस समस्या को हल करने का एकमात्र तरीका मुझे UITableView सामग्री की संपत्ति पर मुख्य मूल्य पर्यवेक्षक का उपयोग करना था।

कुछ डिबगिंग के बाद मुझे एहसास हुआ कि समस्या तब दिखाई देती है जब टेबल व्यू कंटेंट का आकार टेबलव्यू से छोटा होता है। जब मैं viewWillAppear पर KVO शुरू करता हूँ। और देखने के बाद केवीओ 0.3 सेकंड स्टॉप प्रेषण करें। हर बार कंटेंटऑफसेट 0.0 हो गया, केवीओ प्रतिक्रिया देता है और कंटेंटऑफसेट को सर्च बार ऊंचाई पर सेट करता है। मैं केवीओ को 0.3 सेकंड के बाद एसिंक्रोनस रोक देता हूं क्योंकि व्यू लेआउट कंटेंटऑफसेट को रीसेट कर देगा।

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  [self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
}

-(void)viewDidAppear:(BOOL)animated{
   __weak typeof (self) weakSelf = self;
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [weakSelf.tableView removeObserver:self forKeyPath:@"contentOffset"];});
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"contentOffset"] && self.tableView.contentOffset.y == 0.0) {
       self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.tableView.tableHeaderView.frame));
    }
}

-(void)dealloc {
    [self.tableView removeObserver:self forKeyPath:@"contentOffset"];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.