क्या UITableViewStylePlain के साथ UITableView में फ़्लोटिंग हेडर अक्षम करना संभव है?


177

मैं एक UITableViewलेआउट सामग्री 'पृष्ठों' का उपयोग कर रहा हूं । मैं तालिका के हेडर का उपयोग कुछ छवियों आदि को लेआउट करने के लिए कर रहा हूं और मैं इसे पसंद करूंगा यदि वे फ्लोट नहीं करते हैं लेकिन स्थिर रहते हैं क्योंकि वे शैली पर सेट होते हैं UITableViewStyleGrouped

अन्य तब उपयोग करना UITableViewStyleGrouped, क्या ऐसा करने का कोई तरीका है? मैं समूहीकृत का उपयोग करने से बचना चाहूंगा क्योंकि यह मेरी सभी कोशिकाओं को एक मार्जिन जोड़ता है और प्रत्येक कोशिकाओं के लिए पृष्ठभूमि दृश्य को अक्षम करने की आवश्यकता होती है। मुझे अपने लेआउट का पूरा नियंत्रण चाहिए। आदर्श रूप से वे "UITableViewStyleBareBones" होंगे, लेकिन मैंने डॉक्स में वह विकल्प नहीं देखा ...

बहुत धन्यवाद,



59
तालिका शैली का उपयोग करें UITableViewStyleGrouped - यह उन सभी के लिए उत्तर है जो अस्थायी हेडर को अक्षम करने के लिए देख रहे हैं और पूरे प्रश्न को नहीं पढ़ें (यह मेरे साथ हुआ ...)।
औसत जो

@ कैस्केन यह एक शून्य रेखा समाधान है जो महान काम करता है! धन्यवाद।
ली फास्टेनौ

जवाबों:


27

आपको अपनी शीर्ष लेख पंक्तियों को करने के लिए कस्टम सेल का उपयोग करके इसे नकली करने में सक्षम होना चाहिए। इसके बाद टेबल व्यू में किसी अन्य सेल की तरह स्क्रॉल किया जाएगा।

cellForRowAtIndexPathहेडर पंक्ति होने पर आपको सही सेल प्रकार वापस करने के लिए बस कुछ तर्क जोड़ने होंगे ।

आपको संभवतः अपने अनुभागों को स्वयं प्रबंधित करना होगा, हालांकि, एक अनुभाग में सब कुछ है और शीर्ष लेख नकली हैं। (आप हेडर दृश्य के लिए एक छिपे हुए दृश्य को वापस करने की कोशिश कर सकते हैं, लेकिन मुझे नहीं पता कि यह काम करेगा)


11
हाँ ... यह एक हैक की एक सा लगता है। ऐसा लगता है कि Apple के हिस्से का निरीक्षण किया जा रहा है, जैसा कि स्पष्ट रूप से यह करने के लिए कोड है, हमें बस एक ध्वज स्थापित करने में सक्षम होना चाहिए।
मुश्किल

2
किसी विशेष हैक के बिना प्रभाव को प्राप्त करने के सही तरीके के लिए नीचे दिए गए मेरे जवाब की जांच करें, बस हर अनुभाग के पहले सेल को उसके सेक्शन हेडर के रूप में प्रबंधित करें!
सुमित अनंतवार

338

इसे प्राप्त करने का संभवतः एक आसान तरीका:

उद्देश्य सी:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

स्विफ्ट:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

अनुभाग हेडर अब किसी भी नियमित सेल की तरह स्क्रॉल करेंगे।


5
यह फ्रिज एक आकर्षण की तरह काम करता है !! टेबल हेडर व्यू हेडर की उपस्थिति से सेक्शन हेडर को फ्लोटिंग से रोक दिया जाता है। और टेबल के लिए उपयुक्त सामग्री के साथ एक अदृश्य हेडर ट्रिक करता है .. बहुत बहुत धन्यवाद! आश्चर्य है कि इस उत्तर पर अधिक ध्यान क्यों नहीं दिया जा रहा है
श्याम भट्ट

4
अभी भी यह विश्वास नहीं है! कोई निजी एपीआई, कक्षाओं में खुदाई नहीं, कुछ भी नहीं! मैं उम्र के लिए इस समस्या का सामना कर रहा हूं और स्क्रॉल व्यू के शीर्ष पर टेबलव्यू जोड़ रहा हूं (टेबलव्यू स्क्रॉल अक्षम के साथ), जो टेबल हेडर को सामान्य रूप से स्क्रॉल करेगा। लेकिन बस यह खोजना शुरू कर दिया कि क्या सेब ने इसे ठीक करने के लिए हाल ही में कोई नया तरीका प्रदान किया है .. इसलिए खुशी है कि मैं आपके उत्तर पर अड़ गया। धन्यवाद फिर से
श्याम भट्ट

13
एकमात्र दोष मैंने देखा कि शीर्ष शीर्षलेख अब नहीं दिखाया जाएगा (आप इसे केवल स्क्रॉल करके देख सकते हैं)। कम से कम मेरे लिए यह नहीं दिखाया गया है
Ruzard

5
आप तब भी तालिका के टेबलहेडर व्यू को शीर्ष पर ऊँचाई बढ़ाकर, अनुभाग शीर्ष लेख की ऊँचाई के बराबर संख्या के आधार पर और उसी संख्या द्वारा सामग्री इनसेट को कम करके दिखा सकते हैं।
श्याम भाट

2
काश मैं इसे फिर से बढ़ा पाता, मुझे पूरा यकीन है कि कम से कम तीसरी बार जब मैं इस सवाल पर समाप्त हुआ हूं और इससे मेरी समस्या हल हो गई है।
एल नील नील

252

(गलत टेबल शैली के कारण यहां पर कौन आया है) के लिए टेबल को सादे से समूह में बदलें, गुण निरीक्षक के माध्यम से, या कोड के माध्यम से:

let tableView = UITableView(frame: .zero, style: .grouped)

3
यही वह है जिसकी तलाश में मैं हूं। धन्यवाद!
नन्जुद

4
"अन्य तब UITableViewStyleGrouped का उपयोग करना, क्या ऐसा करने का कोई तरीका है?"
माइकल पीटरसन

27
सबसे अच्छी बात यह है कि मैंने सबसे अधिक उत्तोलन को लागू करने से पहले सभी उत्तरों को जांचना सीखा :)
तुंग फैम

1
अब यह लोग, वह उत्तर है जिसकी आपको तलाश थी। ध्यान रखें कि आप TableView Styleसंपत्ति को AttributesInspector में भी पा सकते हैं ।
क्रिस्टियन होल्डुनू

4
इस सवाल में विशेष रूप से एक रास्ता खोजने के लिए उल्लेख है "अन्य तो UITableViewStyleGrouped का उपयोग कर"
Ferdz

73

चेतावनी : यह समाधान एक आरक्षित एपीआई विधि को लागू करता है। यह ऐप को ऐपस्टोर द्वारा वितरण के लिए ऐप्पल द्वारा अनुमोदित होने से रोक सकता है।

मैंने अपने ब्लॉग में फ्लोटिंग सेक्शन हेडर्स के निजी तरीकों का वर्णन किया है

मूल रूप से, आपको बस इसके दो तरीकों में उप-विभाजन UITableViewऔर वापसी करने की आवश्यकता है NO:

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
एक उत्तर केवल एक डाउनवोट के लायक नहीं है क्योंकि यह निजी एपीआई का संदर्भ देता है (हर कोई AppStore को प्रस्तुत करने के लिए कोड नहीं लिख रहा है)। यह सही है जब उत्तर सही होता है। उपवर्ग (या, अधिक आसानी से, एक यूआईटेबल व्यू श्रेणी बनाते हुए) जो इन विधियों के लिए NO लौटाता है, हेडर को तैरने से रोकता है। यदि आप इसे सार्वजनिक API के रूप में जोड़ा हुआ देखना चाहते हैं, तो कृपया बग रिपोर्ट दर्ज करें: bugreport.apple.com
jemmons

5
यदि हम एक ऐप में उस फ़ंक्शन को लागू करते हैं, तो Apple को कैसे पता चलेगा कि आप एक निजी एपीआई का उपयोग कर रहे हैं? वे सभी जानते हैं, मैंने अभी UITableView के एक उपवर्ग में एक विधि लागू की है, और वे यह भी नहीं देख सकते हैं कि कोड को डी-कोड किए बिना, और यह इतना आसान नहीं होगा। यह एक निजी एपीआई में एक विधि का आह्वान नहीं कर रहा है, यह सिर्फ एक को लागू कर रहा है ....
जेवियर सोतो

3
@jemmons यदि आप नहीं चाहते हैं कि मैं आपके उत्तर के निशान को नीचे कर दूं तो यह "निजी एपीआई यहाँ उपयोग किया जाता है"। डिस्क्लेमर का प्रकार :)
kas-kad

2
आपका "मेरा ब्लॉग" लिंक टूट गया है
मार्टिनोमोइजर

12
@jemmons "हर कोई AppStore को प्रस्तुत किया जाने वाला कोड नहीं लिख रहा है" Appstore वास्तव में समस्या नहीं है। समस्या यह है कि ऐप्पल बिना किसी संवाद या अपच के निजी एपीआई को बदल सकता है जो आपके ऐप को तोड़ देगा। यही कारण है कि आप Apple द्वारा अस्वीकार किए जाने की तुलना में निजी APIs का उपयोग क्यों नहीं करना चाहिए
18

29

ठीक है, मुझे पता है कि देर हो चुकी है लेकिन मुझे यह करना पड़ा। मैंने अब तक काम के समाधान की तलाश में 10 घंटे बिताए हैं, लेकिन पूर्ण उत्तर नहीं मिला। कुछ संकेत मिले लेकिन शुरुआत के लिए समझना मुश्किल था। इसलिए मुझे अपने 2 सेंट लगाने पड़े और जवाब पूरा करना पड़ा।

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

तो, कदम हैं।

  1. शैली UITableViewStylePlain के साथ UITableView लागू करें।

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. हमेशा की तरह titleForHeaderInSection को लागू करें (आप अपने स्वयं के तर्क का उपयोग करके यह मान प्राप्त कर सकते हैं, लेकिन मैं मानक प्रतिनिधियों का उपयोग करना पसंद करता हूं)।

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. हमेशा की तरह नंबरOfSectionsInTableView को लागू करें

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. हमेशा की तरह numberOfRowsInSection को लागू करें।

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. ऊँचाई में लौटें 0.0fHeaderInSection।

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. ViewForHeaderInSection को लागू न करें। शून्य वापस करने के बजाय पूरी तरह से विधि निकालें।

  7. ऊंचाई में। जांचें कि क्या (indexpath.row == 0) और सेक्शन हेडर के लिए वांछित सेल की ऊँचाई वापस करें, अन्यथा सेल की ऊँचाई वापस करें।

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. अब CellForRowAtIndexPath में, देखें कि क्या (indexpath.row == 0) और सेल को लागू करें क्योंकि आप चाहते हैं कि अनुभाग हेडर हो और चयन शैली को कोई भी सेट न करें। ईएलएसई सेल को लागू करें जैसा कि आप चाहते हैं कि सामान्य सेल हो।

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. अब कार्यान्वित करेंSelectRowAtIndexPath और रिटर्न nil यदि indexpath.row == 0. यह ध्यान रखेगा कि didSelectRowAtIndexPath कभी भी अनुभाग शीर्ष लेख पंक्ति के लिए निकाल नहीं जाता है।

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. और अंत में didSelectRowAtIndexPath में, जांचें कि क्या (indexpath.row! = 0) और आगे बढ़ें।

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

इसके साथ ही आप कर रहे हैं। अब आपके पास पूरी तरह से स्क्रॉलिंग, नॉन-फ्लोटिंग सेक्शन हैडर है।


1
कार्यान्वित 'willSelectRowAtIndexPath' ताकि सेक्शन हैडर पंक्ति का चयन करने पर नियंत्रण 'didSelectRowAtIndexPath' तक कभी न पहुँचे।
सुमित अनंतवार

असल में, जब हेडर का चयन किया जाता है, तो मैं पंक्तियों को गुना + खोल देता हूं। लेकिन अच्छी पता करने के लिए आप कर सकते हैं कि
Yariv Nissim

शानदार उत्तर, लेकिन 'if (indexPath.row! = 0)' चेक 'didSelectRowAtIndexPath' क्यों? क्या यह केवल अतिरिक्त सुरक्षित होना है? आपके 'willSelectRowAtIndexPath' कार्यान्वयन के साथ पंक्ति कभी भी 0 नहीं हो सकती है?
ग्लेन 85

1
@ Glenn85, देर से जवाब के लिए क्षमा करें। हां यह सिर्फ एक अतिरिक्त सुरक्षा के लिए है।
सुमित अनंतवार

28

अपने इंटरफ़ेस बिल्डर में अपनी समस्या तालिका दृश्य पर क्लिक करें

समस्या तालिका दृश्य

फिर Attributes इंस्पेक्टर पर जाएँ और स्टाइल प्लेन को Grouped में बदलें;) आसान

आसान


17

UITableViewStyleGrouped के बारे में दिलचस्प बात यह है कि tableView कोशिकाओं में शैली जोड़ता है न कि TableView में।

शैली को UIGroupTableViewCellBackground नामक एक वर्ग के रूप में कोशिकाओं के लिए पृष्ठभूमि के रूप में जोड़ा जाता है जो अनुभाग में सेल की स्थिति के अनुसार विभिन्न पृष्ठभूमि को खींचता है।

तो एक बहुत ही सरल उपाय UITableViewStyleGrouped का उपयोग करना होगा, तालिका के बैकग्राउंड को क्लियर करें, और सेलफोर में सेल के बैकग्राउंड व्यू को बदलें:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
यह शीर्ष उत्तर होना चाहिए। यहाँ इसके बारे में एक ब्लॉग पोस्ट है: corecocoa.wordpress.com/2011/09/17/…
सैम

यह समाधान वास्तव में काम नहीं करता है। मैं आसपास की कोशिकाओं में एक अतिरिक्त स्थान प्राप्त करता रहता हूं। कोई उपाय ?
gsempe

2
क्या कक्षों की सामग्री दृश्य अभी भी दाईं ओर स्थानांतरित नहीं होगी?
पिओत्र तोमसिक

15

अपनी तालिका दृश्य शैली बदलें:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

UITableView के लिए सेब प्रलेखन के अनुसार:

UITableViewStylePlain- एक सादा तालिका दृश्य। किसी भी अनुभाग शीर्षलेख या पाद लेख को इनलाइन विभाजक के रूप में प्रदर्शित किया जाता है और तालिका दृश्य स्क्रॉल होने पर तैरता है।

UITableViewStyleGrouped- एक तालिका दृश्य जिसके अनुभाग पंक्तियों के विभिन्न समूहों को प्रस्तुत करते हैं। अनुभाग शीर्ष लेख और पाद लेख फ्लोट नहीं करते हैं।


5

एक और पेचीदा तरीका है। मुख्य विचार अनुभाग संख्या को दोगुना करना है, और पहला केवल हेडर व्यू दिखाता है जबकि दूसरा वास्तविक सेल दिखाता है।

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

फिर क्या करना है शीर्ष लेख को लागू करने के लिए प्रतिनिधि प्रतिनिधियों:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

यह दृष्टिकोण आपके डेटा स्रोतों पर बहुत कम प्रभाव डालता है:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

अन्य दृष्टिकोणों की तुलना में, यह तरीका सुरक्षित है जबकि टेबलव्यू के फ्रेम या सामग्री को नहीं बदलते हैं। आशा है कि यह मदद कर सकता है।


5

सबसे आसान तरीका है कि आप जो चाहते हैं वह अपनी तालिका शैली के रूप में UITableViewStyleGrouped, विभाजक शैली के रूप में सेट है UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

जैसा nilकि आप जो चाहते हैं उसे प्राप्त करने के बाद, हेडर की ऊँचाई और हेडर दृश्य को सेट करने की कोशिश न करें ।


4

हालाँकि यह आपकी समस्या को हल नहीं कर सकता है, यह मेरे लिए तब हुआ जब मैं एक समान काम करना चाहता था। हेडर सेट करने के बजाय मैंने ऊपर के अनुभाग के पाद लेख का उपयोग किया। मुझे बचाने के लिए कि यह खंड प्रकृति में छोटा और स्थिर था, इसलिए यह दृश्य के नीचे से नीचे स्क्रॉल नहीं किया गया था।


महान विचार। मुझे यह हैक बहुत पसंद है।
स्टीव मोजर

थोड़े अजीब। विचार की सराहना करते हैं, लेकिन एक हैक एक हैक है। हेडर नीचे की ओर तैरना शुरू कर देगा ताकि वास्तव में समस्या का समाधान न हो
श्याम भट्ट

4

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

बस UITableViewStyleGroupedनिम्नलिखित के साथ पाद की ऊँचाई को शून्य पर सेट करें और सेट करें:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
आप इसके बजाय 0 वापस कर सकते हैं .leastNormalMagnitude। इसके अलावा आपको लागू करने की आवश्यकता हैtableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
इलियास करीम

@IliasKarim इसे 0 शून्य पर सेट करने के लिए इसे एक गैर-शून्य ऊंचाई है। इसके अलावा, viewForFooterInSectionइस मामले में फ़ंक्शन को लागू करना आवश्यक नहीं है ।
तमसेन सेंगेल

0और .leastNormalMagnitudeएक ही प्रभाव था। viewForFooterSectionविधि को लागू करना आवश्यक है। आपको शून्य पर लौटना चाहिए। यह Xcode 11.3.1 के साथ Swift 5.1 पर है।
इलियास करीम

3

इस समस्या से कैसे संपर्क करें, यह सोचते हुए, मुझे UITableViewStyleGrouped के बारे में एक बहुत महत्वपूर्ण विवरण याद आया। जिस तरह से यूआईटेबल व्यू समूहित शैली (कोशिकाओं के चारों ओर गोल बॉर्डर) को लागू करता है, वह कस्टम बैकग्राउंड व्यू को यूआईटेबल व्यूकैल्स में जोड़कर होता है, न कि यूआईटेबल व्यू में। प्रत्येक सेल को अनुभाग में अपनी स्थिति के अनुसार एक बैकग्राउंड जोड़ा जाता है (ऊपरी पंक्तियों को अनुभाग सीमा के ऊपरी भाग मिलता है, मध्य वाले को साइड बॉर्डर मिलता है और नीचे वाला हिस्सा मिलता है - ठीक है, नीचे का हिस्सा)। तो, अगर हम सिर्फ एक सादे शैली चाहते हैं, और हमारे पास हमारी कोशिकाओं के लिए एक कस्टम पृष्ठभूमि दृश्य नहीं है (जो कि 90% समय में मामला है), तो हम सभी को UITableViewStyleGrouped का उपयोग करने की आवश्यकता है, और कस्टम पृष्ठभूमि को हटा दें । यह उन दो चरणों का पालन करके किया जा सकता है:

हमारी तालिका दृश्य शैली को UITableViewStyleGrouped में बदलें सेल में प्रवेश करने से पहले सेलफॉर्राउ में निम्न पंक्ति जोड़ें:

cell.backgroundView = [[[UIView आवंटित] initWithFrame: cell.bounds] ऑटोरेलिज];

और बस। अस्थायी दृश्य शीर्षकों को छोड़कर तालिका दृश्य शैली बिल्कुल UITableViewStylePlain जैसी हो जाएगी।

उम्मीद है की यह मदद करेगा!


2

हो सकता है कि आप scrollViewDidScrollटेबल व्यू पर उपयोग कर सकते हैं और contentInsetवर्तमान दृश्यमान हेडर के आधार पर बदल सकते हैं ।

यह मेरे उपयोग के मामले के लिए काम करने लगता है!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

इसका एक और तरीका यह है कि आप जिस शीर्ष लेख को चाहते हैं, उससे ठीक पहले एक खाली अनुभाग बनाएं और उस अनुभाग पर अपना शीर्ष लेख डालें। क्योंकि अनुभाग खाली है हेडर तुरंत स्क्रॉल करेगा।


1

आप ऊपर एक खंड (शून्य पंक्तियों के साथ) जोड़ सकते हैं, फिर उपरोक्त अनुभाग को चालू करें। वर्तमान अनुभाग के शीर्ष लेख के रूप में देखें, पाद लेख फ्लोट नहीं करता है। आशा है कि यह एक मदद देता है।


FooterViews फ्लोट करते हैं, जैसे HeaderViews। वे सिर्फ स्क्रीन के नीचे तैरते हैं, ऊपर नहीं।
मार्क ए। डोनोहे

0

XAK को अनदेखा करें। यदि आप चाहते हैं कि आपके ऐप को ऐप्पल द्वारा स्वीकार किए जाने की संभावना हो तो किसी भी निजी तरीकों का पता न लगाएं।

यदि आप इंटरफ़ेस बिल्डर का उपयोग कर रहे हैं तो यह सबसे आसान है। आप दृश्य के शीर्ष पर एक UIView जोड़ेंगे (जहां छवियां चलेंगी), फिर उसके नीचे अपना टेबलव्यू जोड़ें। आईबी को तदनुसार आकार देना चाहिए; यानी, तालिका के शीर्ष पर आपके द्वारा अभी-अभी जोड़े गए UIView के निचले भाग का स्पर्श होता है और यह ऊँचाई स्क्रीन के बाकी हिस्सों को कवर करता है।

यहां सोच यह है कि अगर वह यूआईवीवाई वास्तव में टेबल व्यू का हिस्सा नहीं है, तो वह टेबलव्यू के साथ स्क्रॉल नहीं करेगा। यानी टेबलव्यू हेडर को नजरअंदाज करें।

यदि आप इंटरफ़ेस बिल्डर का उपयोग नहीं कर रहे हैं, तो यह थोड़ा अधिक जटिल है क्योंकि आपको टेबलव्यू के लिए स्थिति और ऊंचाई सही मिल गई है।


इस सवाल का जवाब नहीं है। ट्रिकी टाइटलहैडर व्यू का जिक्र कर रही है जो कि सेल के बीच बैठने वाले विचार हैं, न कि टेबल हैडर व्यू जो आपको सुझाव दे रहे हैं।
डैनियल वुड

0

StoryBoard के साथ शीर्ष लेखों को लागू करने के उत्तर की जाँच करें: तालिका हैडर दृश्य

यह भी ध्यान रखें कि यदि आप लागू नहीं करते हैं

viewForHeaderInSection:(NSInteger)section

यह फ्लोट नहीं करेगा जो कि वास्तव में आप चाहते हैं।


0

फ्लोटिंग सेक्शन के हेडर सेक्शन को पूरी तरह से हटाने के लिए, आप यह कर सकते हैं:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil काम नहीं करता है।

फ़्लोटिंग को अक्षम करने के लिए लेकिन फिर भी सेक्शन हेडर दिखाने के लिए आप अपने स्वयं के व्यवहार के साथ एक कस्टम दृश्य प्रदान कर सकते हैं।


0

@ Samvermette के समाधान पर एक भिन्नता:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

स्निपेट केवल पहले भाग के लिए एक चिपचिपा हैडर प्रदर्शित करता है। अन्य अनुभाग हेडर एक कोशिकाओं के साथ तैरेंगे।

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

यह शीर्ष लेख दृश्य को मैन्युअल रूप से UITableViewController के ViewDidLoad पद्धति में असाइन करने के बजाय प्रतिनिधि के दृश्यForHeaderInSection और heightForHeaderInSection का उपयोग करके प्राप्त किया जा सकता है। UITableViewController के अपने उपवर्ग में उदाहरण के लिए, आप इस तरह से कुछ कर सकते हैं:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

जब उपयोगकर्ता स्क्रॉल करेगा तो हेडर दृश्य गायब हो जाएगा। मुझे नहीं पता कि यह इस तरह क्यों काम करता है, लेकिन आप जो करना चाहते हैं उसे प्राप्त करना प्रतीत होता है।


यह किसी अनुभाग के लिए नहीं है, यह शीर्ष पर 1 शीर्ष लेख के लिए है।
मकदाद

-1

हो सकता है कि आप बस हेडर दृश्य पृष्ठभूमि को पारदर्शी बना सकते हैं:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

या इसे विश्व स्तर पर लागू करें:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

मेरे पास एक और भी सरल समाधान है, जिसका उपयोग ऑटोलॉयआउट के बिना और XIB के माध्यम से किए जाने वाले सब कुछ के साथ किया जाना है:

1 / अपने हेडर को टेबलव्यू पर ड्रैग और ड्रॉप करके सीधे टेबलव्यू पर रखें।

2 / नव निर्मित हेडर के आकार निरीक्षक में, बस इसके ऑटोसाइजिंग को बदलें: आपको केवल शीर्ष, बाएँ और दाएँ एंकर को छोड़ना चाहिए, साथ ही क्षैतिज रूप से भरना चाहिए।

यह हैडर के लिए कैसे सेट किया जाना चाहिए

यह ट्रिक काम आना चाहिए !


-2

@ Samvermette के उत्तर के अनुसार @ मैंने स्विफ्ट में उपर्युक्त कोड लागू किया है ताकि कोडर्स के लिए स्विफ्ट का उपयोग करना आसान हो सके।

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

रेफरी: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

pluse

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

इससे हेडर स्पेस का उपयोग करने में मदद मिली


कृपया, ऐसा मत करो
MQoder

-3

2020 नवीनतम अद्यतन

Xcode 14 के साथ परीक्षण किया गया।

किसी भी सेक्शन हेडर को छिपाने के लिए, सेक्शन डेलिगेट के टाइटल के लिए रिटर्न निल

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

टेबलव्यू डेलीगेट वर्ग में व्यूफॉरहेडरइनसेक्शन पद्धति को लागू करके आप इसे आसानी से प्राप्त कर सकते हैं। यह विधि एक UIView को रिटर्न ऑब्जेक्ट (जो आपका हेडर दृश्य है) के रूप में उम्मीद करती है। मैंने अपने कोड में यही काम किया है


मूल पोस्टर कस्टम हेडर नहीं चाहता है। वे एक ऐसा हेडर चाहते हैं जो तालिका के शीर्ष पर "फ्लोट" न करे। आपका सुझाव अभी भी तैर रहा है।
जम्मों

दृश्य के साथ UITableViewStyleGrouped के लिए तालिका को बदलें, तो यह इसे बंद कर देगा
mskw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.