UITableView (समूहीकृत शैली) में पहला खंड शीर्षलेख कैसे छिपाएं


108

जैसे ही आईओएस 7 के साथ समूहीकृत शैली का उपयोग करने वाले टेबल व्यू का डिज़ाइन काफी बदल गया, मैं पहले सेक्शन के हेडर को छिपाना (या हटाना) चाहूंगा। अब तक मैं इसे हासिल करने में कामयाब नहीं हुआ हूं।

थोड़ा सरल, मेरा कोड इस तरह दिखता है:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
        return 0.0f;
    return 32.0f;
}

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
        return view;
    }
    return nil;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

यदि मैं 0 की ऊँचाई पर लौटता हूँ, तो अन्य दो विधियों को अनुभाग अनुक्रमणिका के साथ कभी नहीं बुलाया जाएगा। फिर भी एक खाली खंड शीर्ष लेख अभी भी डिफ़ॉल्ट ऊँचाई के साथ खींचा गया है। (IOS 6 में, दो तरीकों को कहा जाता है। हालांकि, दृश्यमान परिणाम समान है।)

यदि मैं एक अलग मान लौटाता हूं, तो अनुभाग शीर्षलेख को निर्दिष्ट ऊंचाई मिलती है।

अगर मैं 0.01 लौटाता हूं, तो यह लगभग सही है। हालांकि, जब मैं सिम्युलेटर में "कलर मिसलगाइड इमेजेस" को चालू करता हूं, तो यह सभी टेबल व्यू सेल (जो एक तार्किक परिणाम प्रतीत होता है) को चिह्नित करता है।

UITableView के प्रश्न का उत्तर : खाली अनुभाग से शीर्ष लेख छिपाना प्रतीत होता है कि कुछ लोग अनुभाग शीर्षलेख को छिपाने में सफल रहे। लेकिन यह सादे शैली (समूहीकृत एक के बजाय) पर लागू हो सकता है।

अब तक का सबसे अच्छा समझौता 0.5 की ऊंचाई पर लौट रहा है, जिसके परिणामस्वरूप नेविगेशन बार के नीचे कुछ मोटी रेखा है। हालाँकि, अगर किसी को पता है कि पहला खंड शीर्षलेख पूरी तरह से कैसे छिपाया जा सकता है, तो मैं सराहना करूँगा।

अपडेट करें

के अनुसार caglar के विश्लेषण ( https://stackoverflow.com/a/19056823/413337 ), समस्या केवल उत्पन्न होने पर तालिका दृश्य एक नेविगेशन नियंत्रक में निहित है।


मुझे वह हिस्सा नहीं मिला => अगर (खंड == 0) रिटर्न दृश्य; वापसी; इसका पहला खंड और अन्यथा अन्यथा जब एक दृश्य लौट रहा है?
ज़ेन

यह विचार है कि पहले खंड के लिए 0 की ऊंचाई के साथ एक दृश्य लौटाया जाए और अन्य सभी वर्गों के लिए शून्य लौटाया जाए ताकि तालिका दृश्य उनके लिए डिफ़ॉल्ट शीर्ष लेख दृश्य का उपयोग करे। शून्य हिस्सा अच्छी तरह से काम करता है; तालिका दृश्य इन अनुभागों के लिए एक हेडर दिखाता है। लेकिन सेक्शन 0 के लिए हिस्सा अप्रासंगिक है क्योंकि विधि को कभी नहीं कहा जाता है section == 0
सेप

1
यह उत्तर छोटा और मीठा लगता है। stackoverflow.com/a/23955420/3965
श्री रोजर्स

जवाबों:


154

मेरे पास एक वर्कअराउंड है जो मुझे उचित रूप से साफ लगता है। तो मैं अपने ही सवाल का जवाब दे रहा हूं।

चूंकि पहला खंड हेडर की ऊंचाई काम नहीं करता है, इसलिए मैं 1. वापस आता हूं। फिर मैं सामग्री का उपयोग करता हूं । नेविगेशन बार के नीचे उस ऊंचाई को छिपाने के लिए।

उद्देश्य सी:

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
            return 1.0f;
    return 32.0f;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // return some string here ...
    }
}

- (void) viewDidLoad
{
    [super viewDidLoad];

     self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}

स्विफ्ट:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1.0 : 32
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}

6
इसे छिपाने के लिए 0.1f की हेडर ऊंचाई का उपयोग करना और भी बेहतर है।
क्रुत्सिंगर

4
मैंने 0.1f का उपयोग करने की कोशिश की है। लेकिन नतीजा यह है कि चित्र अब पिक्सेल के लिए संरेखित नहीं होते हैं, जिससे धुंधला हो जाता है और प्रदर्शन कम हो जाता है। बस इसे सिम्युलेटर में आज़माएं: इसमें समस्याग्रस्त संरेखण को उजागर करने का विकल्प है।
कोडो

31
दरअसल, एक बेहतर कार्यान्वयन (भविष्य में टूटने की संभावना) CGFLOAT_MINएक हार्ड-कोडित मूल्य के बजाय उपयोग करना है। दूसरे शब्दों में, नहीं return 1.0fया 0.1fइसके बजाय, return CGFLOAT_MINयदि Apple कभी न्यूनतम स्वीकार्य मूल्य बदलता है, तो आपके पास रिटर्न मान को हार्ड-कोड करने के लिए कोड बदलना होगा। इसके अलावा, आप पहले से ही नहीं जानते हैं कि क्या आप सबसे छोटे मूल्य का उपयोग कर रहे हैं। परिभाषित स्थिरांक का उपयोग करते हुए, आपको सबसे कम संभव मूल्य का उपयोग करने की गारंटी दी जाती है और आपका कोड OS परिवर्तनों से बचेगा।
क्रिस ओस्टमो

11
@ क्रिस: मुझे डर है कि आपको विचार नहीं मिला। मैं बहुत छोटा मान नहीं लौटाता हूं, लेकिन पिक्सेल के आकार का एक से अधिक है ताकि ड्राइंग पिक्सेल संरेखित (अच्छे प्रदर्शन और कुरकुरापन के लिए) बना रहे। मैं फिर सामग्री इनसेट का उपयोग करके इसकी भरपाई करता हूं। यह भविष्य में बदलने की संभावना नहीं है क्योंकि यह एक काफी, दृश्यमान दूरी है और ऐसा कुछ नहीं जिसे ओएस अनदेखा कर सकता है।
कोडो

8
यूआई ऑफसेट के रूप में आंशिक पिक्सेल मूल्यों का उपयोग नहीं करने के लिए +1।
18.08 पर रिकार्डो सांचेज़-साज़

52

यह कैसे UITableView (समूहीकृत शैली) में पहले खंड शीर्ष लेख को छिपाने के लिए है।

स्विफ्ट 3.0 और Xcode 8.0 सॉल्यूशन

  1. TableView के डेलीगेट को heightForHeaderInSection विधि को लागू करना चाहिए

  2. HeightForHeaderInSection विधि के भीतर, कम से कम सकारात्मक संख्या लौटाएं। (शून्य नहीं!)

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        let headerHeight: CGFloat
    
        switch section {
        case 0:
            // hide the header
            headerHeight = CGFloat.leastNonzeroMagnitude
        default:
            headerHeight = 21
        }
    
        return headerHeight
    }

6
0 के बजाय CGFloat.leastNonzeroMagnitude को वापस करने से मुझे मदद मिली। धन्यवाद!
anoo_radha

एकदम सही जवाब, धन्यवाद
पियरे

वैसे, CGFLOAT_MINके लिए ObjC के समान है CGFloat.leastNonzeroMagnitudeमें स्विफ्ट
DawnSong

36

जवाब मेरे और मेरी टीम के लिए बहुत मज़ेदार था, और एक आकर्षण की तरह काम किया

  • इंटरफ़ेस बिल्डर में, दृश्य पदानुक्रम में बस किसी अन्य दृश्य के तहत तालिका दृश्य को स्थानांतरित करें।

कारण:

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


1
जब आप टेबल व्यू को स्क्रॉल करते हैं, तब क्या आपके पास नेविगेशन बार का फ्रॉस्टेड ग्लास प्रभाव होता है?
कोडो

जब आप अपने टेबल व्यू को अपने अनुसार सेट करते हैं तो आपको यह धब्बा प्रभाव पड़ेगा। आपको contentInsetउदाहरण के लिए सेट करने की आवश्यकता होगी {0, 64, 0, 0}ऊपर से 64px ऑफसेट (स्थिति पट्टी प्लस नेविगेशन बार)। तालिका दृश्य को स्क्रीन के शीर्ष पर संलग्न करने की आवश्यकता है, न कि topLayoutGuide (इसे नौसेना पट्टी के नीचे पहुंचने के लिए)
जूलियन एफ। वेनर्ट

यदि आप ताज़ा करने के लिए पुल का उपयोग नहीं कर रहे हैं तो यह ठीक लगेगा।
माइकल

2
वाह। इसने मेरे लिए iOS 9 में काम किया और मेरे दिमाग को उड़ा दिया।
आवंटित करें

यह स्वीकृत उत्तर होना चाहिए। ऐसा अजीब बग!
ऊदबिलाव हरथ

25

समूहीकृत टाइप टेबल व्यू के लिए इस ट्रिक का उपयोग करें

पेस्ट कोड के नीचे कॉपी में अपनी तालिका दृश्य के लिए viewDidLoad विधि:

tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];

मैंने इसकी कोशिश नहीं की है, लेकिन मुझे संदेह है कि इस समाधान में कुछ अन्य प्रस्तावित समाधानों के समान ही नुकसान है: चित्र अब पिक्सेल के लिए संरेखित नहीं होते हैं, जिससे ब्लर्स और प्रदर्शन कम हो जाता है। सिम्युलेटर इसे प्रकट कर सकता है: इसमें समस्याग्रस्त संरेखण को उजागर करने का विकल्प है। हालाँकि, अगर यह 0 से नीचे होता है, तो यह वास्तव में एक अच्छा समाधान है।
कोडो

हाँ, मुझे लगता है कि यह 0. से नीचे हो गया है। क्योंकि मैंने कई बार इसका इस्तेमाल किया, लेकिन ड्रॉइंग में कोई धब्बा नहीं मिला।
नितेश बोरड़

TableHeaderView और हेडर दृश्य? क्या अंतर है,
AsifHabib

या थोड़ा कम _tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]:।
मोज़ुबा

@AsifHabib: tableHeaderView सभी तालिका तत्वों में सबसे ऊपर है। यह तालिका के लिए ही शीर्ष लेख है। और अनुभाग शीर्षलेख दृश्य प्रत्येक अनुभाग पर रखा जाना है। तालिका में निर्दिष्ट अनुभागों के अनुसार कई अनुभाग शीर्ष लेख दृश्य हो सकते हैं। लेकिन, इसमें केवल एक टेबल हेडर दृश्य होगा।
नितेश बोरड़

21

यह तरीका ठीक है।

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return CGFloat.min
    }
    return 25
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    }else {
        ...
    }
}

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

मेरे जैसे लोगों के लिए एक कंटेनर के साथ स्थिर कोशिकाओं का उपयोग करके ठीक काम करता है
thibaut noah

3
स्विफ्ट 3> 'CGFloat.min' का नाम बदलकर 'CGFloat.leastNormalMagnitude' कर दिया गया है
rjobidon

6

मैंने सिर्फ आपका कोड कॉपी किया और कोशिश की। यह सामान्य रूप से चलता है (सिम्युलेटर में आजमाया गया)। मैंने परिणाम दृश्य संलग्न किया। आप ऐसा दृश्य चाहते हैं, है ना? या मैंने आपकी समस्या को गलत समझा?

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


1
हां, यह मूल रूप से वही है जो मैं चाहता हूं, सिवाय मेरी तालिका दृश्य एक नेविगेशन नियंत्रक में है। क्या इससे फर्क पड़ सकता है?
सेप

2
मैंने नेविगेशन कंट्रोलर में tableView जोड़ा और आपकी स्थिति दिखाई देती है :) मुझे लगता है कि iOS 7 में, यह हेडर ऊंचाई समूहबद्ध शैली तालिका दृश्य में डिफ़ॉल्ट रूप से तय करता है। तालिका दृश्य के फ्रेम को बदलकर, पहले हेडर दृश्य को छिपाया जा सकता है। (जैसे सेट x = 0 y = -40)। हालांकि, मुझे पता है कि यह समाधान एक अच्छा समाधान नहीं है।
caglar

1
आपके काम के लिए बहुत-बहुत धन्यवाद। तो ऐसा लगता है कि समस्या केवल तभी उत्पन्न होती है यदि तालिका दृश्य समूहित स्टाइल का उपयोग करता है और नेविगेशन नियंत्रक के भीतर समाहित है।
कोडो सेप

Viewcontroller से tableviewcontroller में बदलने की कोशिश कर रहा हूँ मैं हेडर के साथ समस्या को ठीक नहीं कर सका। शायद मैं इसे बदलने की कोशिश में कुछ याद कर रहा हूँ। (iOS 7.0.3 सिम)
एवगेनी पेट्रोव

1
यह समस्या इस स्नैपशॉट में भी दिखाई देती है! 0 सेल x से शुरू नहीं हो रहा है: 0.0f और y: 0.0f।
बुरहानुद्दीन सुनीलवाला

6

Swift3: heightForHeaderInSection 0 के साथ काम करता है, आपको बस यह सुनिश्चित करना है कि हेडर क्लिपटॉब पर सेट है।

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
       return 0
}

यदि आप क्लिप सेट नहीं करते हैं तो स्क्रॉल छिपा हेडर स्क्रॉल करते समय दिखाई देगा।

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.clipsToBounds = true
}

1
यदि आप पूरी तरह से अनुभाग शीर्ष लेख दृश्य को छिपाने की योजना बना रहे हैं, तो क्लिपटाउंड = सच बहुत महत्वपूर्ण है। इसकी ऊँचाई को 0 / CGFLOAT_MIN पर सेट करना पर्याप्त नहीं है।
अल्टिमैक

5

अद्यतन [९ / १ ९ / १:]: पुराना जवाब मेरे लिए अब iOS ११ में काम नहीं करता है। धन्यवाद Apple। निम्नलिखित ने किया:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);

पिछला उत्तर:

जैसा कि क्रिस ओस्टोमो ने टिप्पणी में पोस्ट किया है, मेरे लिए निम्नलिखित ने काम किया:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return CGFLOAT_MIN; // to get rid of empty section header
}

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

नहीं, मैंने किसी भी सामग्री के मुद्दों पर ध्यान नहीं दिया। अड़चनें ठीक लग रही थीं।
मनिंद्र मोहराना

1
Welp! अब iOS 11 में काम नहीं करता है! मेरा फिक्स एक हफ्ते से कम समय तक चला ..
last

4

यहां एक समूह UITableView में शीर्ष खंड शीर्षलेख से छुटकारा पाने का तरीका है, स्विफ्ट में:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))

3

स्विफ्ट 4.2 और पहले के कई संस्करणों में, पहले हेडर की ऊँचाई को 0 पर सेट करने के बजाय, जैसे अन्य उत्तरों में, आप अन्य हेडर को सेट कर सकते हैं nil। मान लें कि आपके पास दो खंड हैं और केवल 1एक शीर्षलेख के लिए दूसरा (यानी, ) चाहते हैं। उस हेडर में पाठ फ़ॉबर होगा :

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return section == 1 ? "Foobar" : nil
}

3

यदि आप सभी अनुभाग शीर्षकों को पूरी तरह से निकालना चाहते हैं तो इसे आज़माएँ

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

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

बस मुझे जरूरत है। एक सरल और आसान उपाय। 1+
iGhost

0

मैं अभी तक कोई टिप्पणी नहीं कर सकता, लेकिन मुझे लगा कि अगर UISearchControllerआपके नियंत्रक के UISearchBarरूप में आपके साथ आपके संबंध हैं tableHeaderView, तो पहले खंड की ऊँचाई को 0 के रूप में सेट heightForHeaderInSectionकरना वास्तव में काम करता है।

मैं उपयोग करता हूं self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);ताकि खोज बार डिफ़ॉल्ट रूप से छिपा हो।

परिणाम यह है कि पहले खंड के लिए कोई हेडर नहीं है, और नीचे स्क्रॉल करने पर पहली पंक्ति के ठीक ऊपर खोज बार दिखाई देगा।


0

अब तक का सबसे आसान वापस जाने के लिए है nil, या ""में func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?एक वर्ग जहां हेडर प्रदर्शित नहीं करना चाहते हैं के लिए।


0

स्विफ्ट संस्करण: स्विफ्ट 5.1
ज्यादातर, आप टेबल व्यू में ऊंचाई को इस तरह से सेट कर सकते हैं:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   return UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: CGFloat.leastNormalMagnitude))
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
   return CGFloat.leastNormalMagnitude
}

कभी-कभी जब आपने XIT या स्टोरीबोर्ड के साथ UITableView बनाया, तो उत्तर का काम नहीं करता है। आप दूसरे समाधान की कोशिश कर सकते हैं:

let headerView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
self.tableView.tableHeaderView = headerView

आशा है कि यह आप के लिए काम करता है!

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