ios - समूहित UITableview बाहरी विभाजक रेखा को हटा दें




objective-c cell (8)

मेरे पास एक समूहित UITableview है जिसे प्रोग्रामेटिक रूप से बनाया गया है। इसके अलावा मेरे पास टेबलबैक प्रोग्रामेटिक रूप से पॉप्युलेटेड xib फ़ाइल वाला एक सेल भी है। अब तक सब ठीक है। लेकिन मैं केवल बाहरी विभाजक रेखा को हटाना चाहता हूं। मैंने कोड नीचे इस्तेमाल किया लेकिन इस बार सभी विभाजक लाइन हटा दी।

self.tableView.separatorColor = [UIColor clearcolor];

यह मेरी स्थिति के लिए अच्छा विकल्प नहीं है। यहां स्क्रीनशॉट है जो मैं करना चाहता हूं;


Google, यहां तक ​​कि 2018 में, इस प्रश्न के लिए शीर्ष परिणाम के रूप में इस पृष्ठ की सेवा कर रहा है। मेरे पास आईओएस 11 में किसी भी उत्तर दिए गए उत्तरों के साथ कोई भाग्य नहीं था, इसलिए यहां मैं ये आया हूं:

extension UITableViewCell {
    func removeSectionSeparators() {
        for subview in subviews {
            if subview != contentView && subview.frame.width == frame.width {
                subview.removeFromSuperview()
            }
        }
    }
}

किसी भी UITableViewCell उदाहरण पर कॉलिंग .removeSectionSeparators () अब समस्या का ख्याल रखेगा। मेरे मामले में कम से कम, सेक्शन विभाजक एकमात्र चौड़ाई वाले हैं जो सेल के रूप में ही हैं (जैसा कि अन्य सभी इंडेंट हैं)।

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

एक रीलोडेड सेल वापस करने से ठीक पहले मैंने इसे अपने सेलफॉररोएट इंडेक्सपैथ विधि में डाल दिया:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyReusableIdentifier", for: indexPath)

    Timer.scheduledTimer(withTimeInterval: 0.15, repeats: false) { (timer) in
        cell.removeSectionSeparators()
    }

    return cell
}

यह सुरुचिपूर्ण महसूस नहीं करता है, लेकिन मैं अभी तक किसी भी मुद्दे में नहीं चला है।

संपादित करें: ऐसा लगता है कि हमें इसकी भी आवश्यकता है (पुन: उपयोग की जाने वाली कोशिकाओं के लिए):

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.removeSectionSeparators()
}

इस कोड के साथ स्क्रीनशॉट में पहले / बाद में है:

से पहले

बाद


आखिरकार मैं यही आया:

मैं इससे बेहतर कुछ नहीं ढूंढ पाया। लेकिन यह मेरे लिए बहुत काम कर रहा है। आखिरी बार एक्सकोड संस्करण 7.3.1 (7 डी 1014) के साथ प्रयास किया। यह प्रक्रिया स्टोरीबोर्ड के माध्यम से की गई थी।

असल में मैं UITableViewCell पर 0.5 pt ऊंचाई का UIView जोड़ता हूं और फिर उस UIView के लिए पृष्ठभूमि रंग सेट करता हूं। माता-पिता UITableView के सेपरेटर को किसी के रूप में सेट करें।

विवरण यहां दिया गया है:

ध्यान रखें कि आप पहले से ही अपने UITableViewCell, कस्टम या डिफ़ॉल्ट सेट कर चुके हैं। पहले चरण में UITableView के विभाजक को किसी के रूप में सेट नहीं किया गया था।

इसके बाद 1 pt ऊंचाई का UIView जोड़ें और पृष्ठभूमि को सेट करें जैसा कि आपको चाहिए, मेरे मामले में यह लाल है।

बाधाओं को स्थापित करना शुरू करें। समस्या UIView की ऊंचाई को 0.5 pt के रूप में सेट करना है। इस वर्कफ़्लो के लिए यह एकमात्र समस्याग्रस्त समस्या है।

0.5 pt ऊँचाई के साथ UIView:

UIView की 0.5 pt ऊंचाई सेट करने के तरीके को साझा करना।

पहला (1) दृश्य पिन करें और फिर (2) ऊंचाई को 0.5 के रूप में सेट करें। एंटर दबाए।

अंत में आपका UIView निम्न जैसा दिखता है।

मैं ऊंचाई को इस तरह से 0.5 के रूप में सेट करने में सक्षम नहीं था।


आप समूहबद्ध UITableView में स्टेटिक सेल के साथ भी विभाजक को हटा सकते हैं:

class Cell: UITableViewCell {

override func layoutSubviews() {
    super.layoutSubviews()
    for view in subviews where view != contentView {
        view.removeFromSuperview()
    }
}

दृश्य पदानुक्रम का निरीक्षण करने के बाद, ऐसा लगता है कि प्रत्येक UITableViewCell में केवल तीन सबव्यूज़ हैं: सामग्री दृश्य ( UITableViewCellContentView ), और दो विभाजक दृश्य ( _UITableViewCellSeparatorView )। मैं NSStrings से गतिशील वर्ग त्वरण का प्रशंसक नहीं हूं (और न ही ऐप्पल 😉 है)। हालांकि, क्योंकि UITableViewCell की सामग्री UITableViewCell निजी एपीआई का उपयोग किए बिना सुलभ है, समाधान बहुत आसान साबित होता है।

विचार सिर्फ आपके UITableViewCell के contentView के contentView से contentView : contentView , और सामग्री को देखने वाले किसी भी दृश्य को हटाएं दृश्य:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let subviews = cell.subviews
    if subviews.count >= 3 {
        for subview in subviews {
            if subview != cell.contentView {
                subview.removeFromSuperview()
                break
            }
        }
    }
}

tableView(:willDisplayCell:forRowAtIndexPath:) को टेबल व्यू प्रतिपादन के दौरान कई बार कहा जाता है, इसलिए उपर्युक्त सेल के कितने सबव्यूव की जांच करके राज्य का ट्रैक रखता है। यदि इसमें तीन सबव्यूव हैं, तो दोनों विभाजक अभी भी बरकरार हैं। यह केवल विभाजकों में से एक को हटा देता है, लेकिन आप break को हटाकर दोनों को हटा सकते हैं। आप यह भी निर्दिष्ट कर सकते हैं कि सबव्यू के फ्रेम की जांच करके शीर्ष विभाजक या नीचे विभाजक को हटाना है या नहीं। यदि फ्रेम की वाई-अक्ष उत्पत्ति 0 , तो यह शीर्ष विभाजक है। यदि यह 0 नहीं है, तो यह नीचे है।

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

स्विफ्ट 4 अपडेट:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let subviews = cell.subviews
    guard subviews.count >= 3 else {
        return
    }

    for subview in subviews where NSStringFromClass(subview.classForCoder) == "_UITableViewCellSeparatorView" {
        subview.removeFromSuperview()
    }
}

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


मैंने अभी एक समाधान तैयार किया है, क्योंकि सेल में contentView जो एक UIView , इसलिए मुझे लगता है कि आप सामग्री contentView की contentView पर ध्यान केंद्रित कर सकते हैं।

मेरा कोड यहाँ है:

सबसे पहले, आपको विभाजक को साफ़ करना होगा

tableView.separatorColor = UIColor.clear

दूसरा, cellForRowAt फ़ंक्शन में:

let bottomBorder = CALayer()

bottomBorder.frame = CGRect(x: 0.0, y: 43.0, width: cell.contentView.frame.size.width, height: 1.0)
bottomBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).cgColor
cell.contentView.layer.addSublayer(bottomBorder)

यहां आप इस तरह यूआई देखेंगे:


यहां एक स्विफ्ट समाधान है जो आईओएस 8 और 9 पर काम करता है।

एक डिफ़ॉल्ट कार्यान्वयन के साथ एक प्रोटोकॉल परिभाषित करें:

protocol CellSeparatorRemovable { }

extension CellSeparatorRemovable {
    func removeSeparatorLinesFromCell(cell: UITableViewCell, section: Int, row: Int, indexPath: NSIndexPath) {
        guard (section, row) == (indexPath.section, indexPath.row) else { return }

        for view in cell.subviews where view != cell.contentView {
            view.removeFromSuperview()
        }
    }
}

फिर, जहां भी आप इसका उपयोग करना चाहते हैं, CellSeparatorRemovable प्रोटोकॉल के अनुरूप है और इसकी विधि से कॉल करें …willDisplayCell… :

class SomeVC: UITableViewController, CellSeparatorRemovable {
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        removeSeparatorLinesFromCell(cell, section: 1, row: 1, indexPath: indexPath)
    }
}

यह एक न्यूनतम समाधान है; यदि आप अत्यधिक रिकर्सन और / या सेल पुन: उपयोग के मुद्दों से बचने के लिए कई कोशिकाओं से निपट रहे हैं तो आपको इसे पुन: सक्रिय करने की आवश्यकता हो सकती है।


यहां समाधान। यह स्थैतिक कोशिकाओं के लिए है। यदि आप गतिशील चाहते हैं तो बस "गिनती" को फिर से लिखें। आशा करता हूँ की ये काम करेगा।

extension NSObject {
   var theClassName: String {
       return    NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
   }
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.separatorStyle = .None
}
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let count = tableView.numberOfRowsInSection(indexPath.section)
    if ( indexPath.row != count - 1 ) {
        for view in cell.subviews {
            if view.theClassName == "_UITableViewCellSeparatorView" {
                view.backgroundColor = UIColors.redColor()
            }
        }
    }
}






tableviewcell