UITableView में विभाजक की पूरी चौड़ाई कैसे सेट करें


149

मेरे पास एक ऐसा स्थान है UITableViewजहां विभाजकों के पास पूरी चौड़ाई नहीं है। यह बाईं ओर से पहले 10 पिक्सेल की तरह समाप्त होता है। मैं इस कोड के साथ खेल रहा था viewDidLoad()

self.tableView.layoutMargins = UIEdgeInsetsZero;

साथ ही स्टोरीबोर्ड में जब आप कस्टम या डिफ़ॉल्ट चयनकर्ताओं का चयन कर सकते हैं। अब जो सभी कोशिकाएँ आबाद हैं उनमें पूर्ण-चौड़ाई के चयनकर्ता नहीं हैं लेकिन जो कोशिकाएँ खाली हैं उनकी पूरी चौड़ाई है।

मैं इसे कैसे ठीक करूं?


9
UITableViewएक संपत्ति है separatorInsetUITableViewलाइन विभाजक के इनसेट को शून्य पर सेट करें । इसके अलावा आप separatorInsetस्टोरीबोर्ड से बदल सकते हैं
KRUKUSA

जवाबों:


220

इसने मेरे लिए iOS 8.4 - 9.0 डिवाइस पर Xcode 6.4 और Swift 1.2 का उपयोग कर काम किया:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

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

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

यह मेरी तालिका को रिक्त के साथ क्यों निकालता है? सेपरेटरों को स्थानांतरित कर दिया गया है, लेकिन मैं अपने किसी भी बटन को नहीं देख सकता हूं
ऑस्कर

1
@ जेम्स क्या आप कृपया समझा सकते हैं "मेरी मेज को एक खाली के साथ हटा दें?"। आपने अपने बटन (IB, कोड के माध्यम से) कैसे जोड़े हैं?
MB_iOSDeveloper

1
बहुत अच्छा समाधान है। लेकिन मेरे मामले में मैंने कोड को सेल इनिशियलाइज़ेशन में सीधे डाल दिया, बीक्युस मैं सभी नियंत्रकों में विभाजक की पूरी चौड़ाई चाहता था।
Vojta

यदि यह स्पष्ट नहीं है, तो यह पाठ्यक्रम के उचित सिंटैक्स परिवर्तनों के साथ ऑब्जेक्टिव-सी के लिए भी काम करता है।
कोहेनैडेयर

1
इनमें से कोई भी समाधान iPad पर काम नहीं करता है। यह केवल एक iPhone पर काम करता है ...
चार्ल्स रॉबर्टसन

103

मुझे इस पोस्ट से जवाब मिला: iOS 8 UITableView सेपरेटर इनसेट 0 काम नहीं कर रहा है

बस इस कोड को अपने पर जोड़ें UITableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

2
यह मेरे लिए केवल टेबल व्यू प्रतिनिधि पद्धति
टोनीटोनी

आई एम सॉरी मुझे समझ नहीं आया आपका मतलब है कि आपके लिए TableViewDeleagte जोड़ना पर्याप्त था। मैंने सिर्फ जोड़ने की कोशिश की कि यह मेरे लिए काम नहीं किया @TonyTony
Timo Cengiz

3
मेरे लिए विधि viewDidLayoutSubviewsआवश्यक नहीं है
टोनीटोनी

DId आप 8 से अन्य IOS संस्करणों के साथ अपने कोड को चलाने की कोशिश करते हैं? शायद यह सबसे नए लोगों के लिए काम करता है। अन्यथा आपके लिए अच्छा है कि यह काम करता है। मैंने सिर्फ टेबलव्यू प्रतिनिधि पद्धति को जोड़ने की कोशिश की और इससे कोई फायदा नहीं हुआ। @ टोनीटोनी
टिमो

मुझे दोनों का उपयोग करना था। मैंने बिना किसी सफलता के व्यक्तिगत रूप से प्रत्येक का उपयोग करने की कोशिश की। यह तभी काम किया जब मैंने दोनों का इस्तेमाल किया। इसके अलावा, मैंने इसे तब आजमाया जब मेरा दृश्य नियंत्रक UITableViewController का एक उपवर्ग था, और जब यह UIViewController का उपवर्ग था। कोई फर्क नहीं। ध्यान दें कि मैं 8.1 सिम्युलेटर में चल रहा हूं।
रॉन

100

अपने में UITableViewCell

अपने इंटरफ़ेस बिल्डर में अटेंडेस इंस्पेक्टर के पास जाएं और बस "15" को 0. बदल दें। यह उन सभी कोशिकाओं के लिए करें जिन्हें आप बदलना चाहते हैं।

instets

आपको [cell setLayoutMargins:UIEdgeInsetsZero];अपने से जोड़ना पड़ सकता हैtableViewCell


1
या यह अजीब है। इसने मेरे लिए काम किया (धन्यवाद!) उन पंक्तियों पर जहां मेरे पास UITableViewCells प्रदर्शित होने के लिए था, लेकिन उनके नीचे की किसी भी खाली पंक्तियों पर, विभाजक अभी भी 15 पिक्सेल द्वारा प्रेरित था।
माइक गिल्डहिल

यदि आप स्थैतिक कोशिकाओं का उपयोग कर रहे हैं, तो आपको केवल छवि में वर्णित की तरह बाएं इनसेट को 0 में बदलना होगा (iOS 10, Xcode 8.3.1 में कार्य करना)
इग्नासियो वाल्डिवेयो

29

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

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. अपना चुने UITableViewCell
  2. इंस्पेक्टर इंस्पेक्टर के पास जाओ
  3. विभाजक पर जाएं और इसे "कस्टम इनसेट" में बदलें
  4. सेट leftऔर / या rightफ़ील्ड। (डिफ़ॉल्ट रूप left: 15से right: 0)

देखो कि यह कैसे काम करता है (उपयोग करते हुए left: 100):

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

परिणाम:

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


1
@ हन्ना लोइसा कार्नी से पिछले जवाब की नकल
कोन्स्टेंटिन सलातावोव

19

मुझे इनहेरिट करना है UITableViewControllerऔर दो इनसेट सेटिंग में अतिरिक्त की जरूरत है ताकि वह गलत willDisplayCellपर सेट हो preservesSuperviewLayoutMarginsसके। स्विफ्ट में ऐसा दिखता है:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

आपको सेट करने की आवश्यकता नहीं है preservesSuperviewLayoutMargins = falseक्योंकि डिफ़ॉल्ट मान पहले से ही गलत है
crubio

2
ध्यान दें कि यह आपके कोशिकाओं के नीचे के दृश्य को भरने के लिए नियंत्रक द्वारा प्रदर्शित 'प्लेसहोल्डर' कोशिकाओं पर विभाजकों को समायोजित नहीं करेगा यदि आप कोशिकाएं पूरी ऊंचाई तक नहीं बनाती हैं।
तीये की

11

विभाजक Insetबाईं ओर से 15 डिफ़ॉल्ट रूप से है। सेपरेटर बदलें Insetसे विकल्प autoके लिए customऔर स्थापित करने के लिए इनसेट 0

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


9

IOS 9+ में स्विफ्ट के लिए

यदि कोई प्रथा का उपयोग कर रहा है UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

फिर अपने लिए UITableViewमें viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

यह एकमात्र उत्तर है जिसने इसे मेरे लिए तय किया (3 स्विफ्ट में अपडेट किया गया)। हालाँकि ... यह तब काम करता है जब सेल में डेटा होता है। रिक्त कोशिकाओं के लिए जो अभी तक भरे नहीं गए हैं (और मुझे लगता है कि यह ओवरराइड लेआउट नहीं कहा जाता है। वैरिएबल वैरिएबल) विभाजक अभी भी तालिका में मेरे कस्टम सेल की पूरी चौड़ाई नहीं भरता है। उस पर कोई विचार?
RanLearns

IPhone पर, विभाजक बाईं ओर से कुछ पिक्सेल और खाली कोशिकाओं पर दाईं ओर से कुछ पिक्सेल समाप्त होता है। मार्जिन को शून्य करने के लिए इस ट्रिक का उपयोग किए बिना यह ठीक दिखता है। IPad पर वास्तविक समस्या है - एक खाली सेल पर विभाजक, टेबलव्यू के बाएं किनारे से जाते हैं, सेल की चौड़ाई का केवल 80% हिस्सा है। जब कक्ष में डेटा होता है, तो विभाजक अभी भी सेल की चौड़ाई का 80% है, लेकिन यह 20% रास्ते में शुरू होता है और
तालिका

1
एक समाधान का पता लगाया ... यदि #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} का उपयोग करके इसे बनाया, तो मुझे iPhone पर आपके कोड की आवश्यकता नहीं है। विभाजक पूरी चौड़ाई में जाता है। IPad पर, रिक्त कक्षों में एक पूर्ण चौड़ाई विभाजक होता है, लेकिन डेटा जोड़े जाने पर पूरी चौड़ाई रखने के लिए मुझे आपके कोड की आवश्यकता होती है। अन्यथा, बाईं ओर कुछ पिक्सेल जोड़े जाते हैं जहां सेल भरने के बाद कोई विभाजक नहीं होता है।
RanLearns

1
उत्तर जहाँ मुझे ऊपर टिप्पणी में कोड मिला है: stackoverflow.com/a/31538250/428981
RanLearns

9

IPad के साथ समस्या वाले लोगों के लिए - यह आपको उस स्थिति में मिलेगा जो iPhone के समान है। फिर आप separatorInsetआवश्यकतानुसार आवश्यकतानुसार समायोजित कर सकते हैं ।

tableView.cellLayoutMarginsFollowReadableWidth = false

यह iOS 10 बनाम iOS 11 पर मेरी समस्या थी। iOS 11 ठीक था, लेकिन 10 का मार्जिन अलग था। धन्यवाद!!!
migs647

9

cellForRowAtIndexPathसेल के विभाजक चश्मे को कॉन्फ़िगर करने के लिए इसे विधि में उपयोग करें ,
यह iOS9.0 + के लिए एकदम सही काम करता है

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;

8

IOS 9.3 और स्विफ्ट 2.2 के लिए परीक्षण किया गया। उस कोड को सुनिश्चित करें willDisplayCellजिसमें सेल प्रदर्शित करने से ठीक पहले कहा जाता है और यह नहीं cellForRowAtIndexPathकि आप सेल का निर्माण कहां करते हैं।

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

इसके overrideलिए फ़ंक्शन में जोड़ें UITableViewController, जैसे:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

उपरोक्त में से किसी ने भी मेरे लिए स्विफ्ट 2.2 और एक्सकोड 7.3.1 में काम नहीं किया

सभी का सबसे सरल समाधान निकला। कोई कोड की जरूरत है। बस TableViewCellअपने UITableViewनिरीक्षक में लेआउट मार्जिन मान बदलें :


4

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

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

में viewDidLoad(परीक्षण iOS11 - स्विफ्ट 4.1)

प्रयत्न

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

इनमें से कोई भी समाधान iPad पर काम नहीं करता है, लेकिन मैं एक ऐसा समाधान लेकर आया हूं, जिसमें दोनों उपकरणों को शामिल किया गया है:

पुन: प्रयोज्य कोशिकाओं के साथ:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

गैर पुन: प्रयोज्य कोशिकाओं के साथ:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

बस इस दृष्टिकोण पर विस्तार करने के लिए:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

दोनों गुणों का उपयोग UITableView& द्वारा किया जा सकता है UITableViewCell। उत्तरार्द्ध, वास्तव में, की एक संपत्ति है UIView, जो दोनों का एक मूल वर्ग है UITableView& UITableViewCell


1
गैर-पुन: प्रयोज्य कोशिकाओं के लिए एकमात्र उपयोगी समाधान मुझे मिला
मिकी

0

स्विफ्ट 5, Xcode 11 अपडेट

इसे अंदर देखें

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

एज टू एज विभाजक के लिए बस बाएं और दाएं का मान 0 पर सेट करें।

वैसे "yourTableView" को अपने tableView आउटलेट नाम में बदलें।

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