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




uitableview ios8 (6)

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

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

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

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


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

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

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

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

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

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

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

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 73`

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

  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 प्लस

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

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableViewAutomaticDimension`

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

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

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

यह आपके टेबल व्यू पर estimatedSectionHeaderHeight SHHHHHHHH की स्थापना (या लौटकर) करके पूरा किया जा सकता है।

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

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


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

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

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

    return label
}

स्विफ्ट 4+

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

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

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

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

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

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

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

       return UITableView.automaticDimension

   }




autolayout