क्या ऑटो लेआउट का उपयोग करके डायनामिक टेबल व्यू सेक्शन हेडर ऊंचाई प्राप्त करना संभव है?


112

IOS 8 में नया, आप केवल अनुमानित पंक्ति ऊंचाई सेट करके 100% डायनामिक टेबल व्यू सेल प्राप्त कर सकते हैं, फिर ऑटो लेआउट का उपयोग करके सेल में अपने तत्वों को लेआउट कर सकते हैं। यदि सामग्री ऊंचाई में बढ़ती है, तो सेल भी ऊंचाई में बढ़ेगी। यह अत्यंत उपयोगी है, और मैं सोच रहा हूं कि क्या टेबल हेड में अनुभाग हेडर के लिए एक ही उपलब्धि पूरी की जा सकती है?

उदाहरण के लिए, क्या कोई व्यक्ति, एक सब- UIViewवे बना सकता है tableView:viewForHeaderInSection:, एक UILabelसबव्यू जोड़ सकता है , दृश्य के विरुद्ध लेबल के लिए ऑटो लेआउट की बाध्यता निर्दिष्ट कर सकता है, और लेबल की सामग्री को लागू करने के लिए ऊंचाई में दृश्य वृद्धि हुई है, लागू किए बिना tableView:heightForHeaderInSection:?

viewForHeaderInSectionराज्यों के लिए प्रलेखन : "यह विधि केवल तभी सही ढंग से काम करती है जब tableView: heightForHeaderInSection: भी लागू किया जाता है।" मैंने यह नहीं सुना है कि iOS 8 के लिए कुछ भी बदल गया है।

यदि कोई ऐसा नहीं कर सकता है, तो इस व्यवहार की नकल करने का सबसे अच्छा तरीका क्या है?

जवाबों:


275

यह संभव है। IOS 8 में लागू डायनेमिक सेल हाइट्स के साथ यह नया सही है।

यह बहुत सरल है। बस इसमें जोड़ें viewDidLoad:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

फिर ओवरराइड viewForHeaderInSectionऔर ऑटो लेआउट का उपयोग करें अपने तत्वों में तत्वों को विवश करने के लिए फिट के रूप में देखा। बस! लागू करने की जरूरत नहीं heightForHeaderInSection। और वास्तव में sectionHeaderHeightजरूरत नहीं है या तो कहा जा सकता है, मैं सिर्फ स्पष्टता के लिए इसे जोड़ा।

ध्यान दें कि iOS 11 में, सेल और हेडर / पाद दृश्य, डिफ़ॉल्ट रूप से अनुमानित ऊंचाइयों का उपयोग करते हैं। केवल एक चीज करने के लिए एक अनुमानित ऊंचाई प्रदान करना है ताकि सिस्टम को बेहतर ढंग से सूचित किया जा सके कि क्या उम्मीद है। डिफ़ॉल्ट मान है, UITableViewAutomaticDimensionलेकिन आपको एक बेहतर अनुमान प्रदान करना चाहिए कि औसत ऊंचाई है यदि संभव हो तो वे होंगे।


3
अगर यह काम करता है तो शांत है, लेकिन डॉक्स ने इसका उल्लेख नहीं किया है, और अगर मुझे सही तरीके से याद नहीं है तो न ही डब्ल्यूडब्ल्यूडीसी सत्र। के लिये दस्तावेज UITableViewAutomaticDimensionकहते हैं "अगर आप में यह लगातार वापसी tableView:heightForHeaderInSection:या tableView:heightForFooterInSection:, UITableViewएक ऊंचाई से दिए गए मान फिट बैठता है का उपयोग करता है tableView:titleForHeaderInSection:या tableView:titleForFooterInSection:(अगर शीर्षक नहीं है nil)।"
एरोन ब्रेजर

28
यह मेरे लिए काम नहीं किया। मेरा अनुभाग शीर्षलेख स्वचालित रूप से ऊंचाई की गणना करने में सक्षम था, लेकिन यह अनुभाग में कोशिकाओं को ओवरलैप करता है। मैं एक xib फ़ाइल का उपयोग करके अपने हेडर दृश्य को स्थापित कर रहा हूं और इंटरफ़ेस बिल्डर में अपनी बाधाओं को स्थापित कर रहा हूं। क्या यह मेरी समस्या है? आप लोग कहाँ अड़चन पैदा कर रहे हैं? धन्यवाद!
CoBrA2168

5
जैसा कि यहां बताया गया है कि नमूना कोड है: github.com/ebetabox/DynamicCellSectionHeight
PakitoV

10
यहां एक अन्य मुख्य बिंदु, आपकी टेबल कोशिकाओं को ऑटो ऊंचाई (UITableViewAutomaticDimension) गणना के लिए कॉन्फ़िगर करने की आवश्यकता है ताकि वर्गों पर काम किया जा सके।
बॉब स्प्रीं डे

9
आप होना आवश्यक है estimatedSectionHeaderHeightया tableView:estimatedHeightForHeaderInSection:और sectionHeaderHeightया tableView:heightForHeaderInSection:। इसके अतिरिक्त, यदि आप प्रतिनिधि विधियों का उपयोग कर रहे हैं, तो आपको अनुमान (पूरी तरह से अनिर्दिष्ट व्यवहार) के लिए 1.00 से बड़ा मान वापस करना होगा, अन्यथा ऊंचाई के लिए प्रतिनिधि को नहीं बुलाया जाएगा और डिफ़ॉल्ट टेबल व्यू हेडर ऊंचाई का उपयोग किया जाएगा।
वडॉफ़

29

यह estimatedSectionHeaderHeightआपके टेबल व्यू पर सेटिंग (या लौटकर) द्वारा पूरा किया जा सकता है ।

यदि आपका अनुभाग शीर्ष लेख सेटिंग के बाद आपकी कोशिकाओं को ओवरलैप कर रहा हैestimatedSectionHeaderHeight , तो सुनिश्चित करें कि आप एक उपयोग कर रहे हैं estimatedRowHeight

(मैं इस जवाब को जोड़ रहा हूं क्योंकि दूसरे पैराग्राफ में एक मुद्दे का जवाब है जो सभी टिप्पणियों के माध्यम से पढ़ने के बाद पाया जा सकता है जो कुछ याद कर सकते हैं।)


1
धन्यवाद, estimatedRowHeightइस काम को सेट करने के बाद आकर्षण की तरह :)
sz ashik

1
यदि आप पंक्तियों के लिए UITableViewAutomaticDimension का उपयोग नहीं कर रहे हैं तो भी यह सत्य है। मुझे एक घंटे बचाने के लिए धन्यवाद।
रयान रोमनचुक

14

उसी अंक में अटक गया, जहां हेडर शून्य ऊंचाई तक नहीं मिल रहा था और जब तक कि मैं प्रतिनिधि के लिए एक निश्चित ऊंचाई प्रदान नहीं करता heighForHeaderInSection

बहुत सारे समाधानों की कोशिश की जिसमें शामिल हैं

self.tableView.sectionHeaderHeight = UITableView.automaticDimension
self.tableView.estimatedSectionHeaderHeight = 73

लेकिन कुछ भी काम नहीं आया। मेरी कोशिका उचित ऑटोलैयूट का भी उपयोग कर रही थी। पंक्तियाँ निम्न कोड का उपयोग करके गतिशील रूप से अपनी ऊंचाई बदल रही थीं, लेकिन अनुभाग शीर्ष लेख नहीं थे।

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableView.automaticDimension

यह फिक्स बेहद सरल और अजीब है लेकिन मुझे इसके लिए 1 लाइन कोड के बजाय डेलिगेट विधियों को लागू करना पड़ा estimatedSectionHeaderHeightऔर sectionHeaderHeightजो मेरे मामले के लिए निम्नानुसार है।

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

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    73
}

11

स्विफ्ट 4+

काम करना (100% का परीक्षण)

यदि आपको सामग्री के आधार पर गतिशील ऊँचाई के साथ-साथ दोनों खंडों की आवश्यकता है तो आप नीचे दिए गए कोड का उपयोग कर सकते हैं:

ViewDidLoad () पर यह पंक्तियाँ लिखें:

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

अब हमने यूआईटेबल व्यू डेलिगेट विधियों का उपयोग करके पंक्ति की ऊंचाई और अनुभाग ऊंचाई निर्धारित की है:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }

इस महान जवाब पर ध्यान दें2020 तक यह देखने में ठीक लगता है कि केवल व्यूडलड में चार गुणों का उपयोग करें।
फटी

इस महान जवाब पर ध्यान दें2020 तक आपको अनुमानित ऊंचाई देने वाली दो "बेकार" लाइनों की आवश्यकता है (जैसे, 20 या तो)।
फेटी

6

मैंने कोशिश की

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

लेकिन यह मल्टीलाइन लेबल के साथ हेडर का सही आकार नहीं देता। मेरी समस्या को हल करने के लिए इसे जोड़ा गया:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}

डेटा स्रोत फ़ंक्शंस को परिभाषित करें tableView:estimatedHeightForHeaderInSectionऔर tableView:heightForHeaderInSectionइसके बजाय viewDidLoad पर परिभाषित करें।
कीथ येओ

मैंने पाया estimatedSectionHeaderHeightकि iOS 11 से नीचे सेटिंग आवश्यक है
डॉक्टरब्रोकर

1

मेरे मामले में:

  1. प्रोग्रामेटिक रूप से सेट न करें

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension

  1. स्टोरीबोर्ड में काम नहीं किया गया

  2. ओवरराइड heightForHeaderInSection काम किया

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

परीक्षण पर्यावरण:

  • मैक ओएस 10.13.4
  • XCode संस्करण 9.4.1
  • सिम्युलेटर iPhone 8 प्लस

0

हां, यह मेरे लिए काम करता है। मुझे नीचे के रूप में अधिक परिवर्तन करने होंगे:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()

    label.numberOfLines = 0
    label.text          = my own text

    return label
}

-2

मैंने iuriimoz उत्तर को संशोधित किया । अभी-अभी बदला गया दृश्य विधि:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.layoutIfNeeded() 
}

इसके अलावा tableView.layoutIfNeeded () को जोड़ें

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    tableView.layoutIfNeeded()
}

IOS 10 के लिए

tableView.beginUpdates()
tableView.endUpdates()

मेरे लिए "WadeAppear "पर" फीका "एनीमेशन प्रभाव है

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