วิธีการตั้งค่าความกว้างเต็มของตัวคั่นใน UITableView


149

ฉันมีUITableViewที่คั่นไม่ได้เต็มความกว้าง มันจบลงเช่น 10 พิกเซลก่อนทางด้านซ้าย viewDidLoad()ผมเล่นรอบกับรหัสนี้ใน

self.tableView.layoutMargins = UIEdgeInsetsZero;

นอกจากนี้ในกระดานเรื่องราวเมื่อคุณสามารถเลือกตัวเลือกกำหนดเองหรือค่าเริ่มต้น ตอนนี้เซลล์ทั้งหมดที่มีประชากรไม่มีตัวเลือกแบบเต็มความกว้าง แต่เซลล์ที่ว่างเปล่ามีความกว้างแบบเต็ม

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


9
UITableViewseparatorInsetมีสถานที่ให้บริการ ตั้งค่าสิ่งที่แทรกของUITableViewตัวแยกบรรทัดเป็นศูนย์ นอกจากนี้คุณสามารถเปลี่ยน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
}

อัพเดต Swift 5:

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

ทำไมสิ่งนี้จึงลบตารางของฉันด้วยอันที่ว่างเปล่า ตัวคั่นถูกย้าย แต่ฉันไม่เห็นปุ่มใด ๆ ของฉันเลย
Oscar

1
@ James ช่วยกรุณาอธิบาย "ลบตารางของฉันด้วยอันว่างเปล่าได้ไหม?" คุณเพิ่มปุ่มของคุณ (ผ่าน IB, code) ได้อย่างไร?
MB_iOSDeveloper

1
ทางออกที่ดีมาก แต่ในกรณีของฉันฉันใส่รหัสตรงกับการเริ่มต้นเซลล์เพราะฉันต้องการที่จะมีความกว้างเต็มของตัวคั่นในตัวควบคุมทั้งหมด
Vojta

ในกรณีที่ไม่ชัดเจนก็สามารถใช้งานได้กับ Objective-C พร้อมการเปลี่ยนแปลงทางไวยากรณ์ที่เหมาะสมแน่นอน
โคเฮแนร์

1
โซลูชันเหล่านี้ไม่สามารถใช้งานกับ iPad ได้ ใช้งานได้กับ iPhone เท่านั้น ...
Charles Robertson

103

ฉันได้รับคำตอบจากโพสต์นี้: iOS 8 UITableView separator inset 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
มันใช้งานได้สำหรับฉันสำหรับการเพิ่มเฉพาะวิธีการมอบสิทธิ์ tableView
TonyTony

ฉันขอโทษฉันไม่ได้ understad คุณหมายความว่ามันเพียงพอสำหรับคุณที่จะเพิ่ม TableViewDeleagte? ฉันเพิ่งลองเพิ่มว่ามันไม่ได้ผลสำหรับฉัน @TonyTony
Timo Cengiz

3
สำหรับฉันวิธีการviewDidLayoutSubviewsไม่จำเป็นต้องใช้
TonyTony

คุณพยายามเรียกใช้รหัสของคุณกับ IOS เวอร์ชันอื่นที่ไม่ใช่ 8 หรือไม่? บางทีมันอาจใช้งานได้กับเครื่องใหม่ล่าสุด เป็นอย่างอื่นที่ดีสำหรับคุณว่ามันใช้งานได้ ฉันพยายามเพิ่มวิธีการมอบสิทธิ์ tableview และมันก็ไม่ได้ช่วยอะไร @TonyTony
Timo Cengiz

ฉันต้องใช้ทั้งคู่ ฉันลองใช้ทีละตัวโดยไม่ประสบความสำเร็จ ใช้งานได้เฉพาะเมื่อฉันใช้ทั้งคู่ นอกจากนี้ฉันลองใช้เมื่อตัวควบคุมมุมมองของฉันเป็น subclass ของ UITableViewController และเมื่อมันเป็น subclass ของ UIViewController ไม่แตกต่าง. โปรดทราบว่าฉันกำลังทำงานในเครื่องมือจำลอง 8.1
Ron

100

ในตัวคุณ UITableViewCell

ไปที่ตัวตรวจสอบคุณสมบัติในเครื่องมือสร้างส่วนต่อประสานและเปลี่ยน "15" เป็น 0 ทำสิ่งนี้กับเซลล์ทั้งหมดที่คุณต้องการเปลี่ยน

instets

คุณอาจต้องเพิ่ม[cell setLayoutMargins:UIEdgeInsetsZero];ของคุณtableViewCell


1
หรือว่าแปลก สิ่งนี้ใช้งานได้สำหรับฉัน (ขอบคุณ!) ในแถวที่ฉันมี UITableViewCells ที่จะแสดง แต่ในแถวว่าง ๆ ด้านล่างพวกเขาตัวคั่นยังคงเยื้อง 15 พิกเซล
Mike Gledhill

หากคุณใช้เซลล์แบบคงที่สิ่งที่คุณต้องมีก็คือการเปลี่ยนสิ่งที่ใส่เข้าไปทางซ้ายเป็น 0 เช่นที่อธิบายไว้ในภาพ (ทำงานใน iOS 10, Xcode 8.3.1)
Ignacio Valdivieso


20
  1. เลือกของคุณ UITableViewCell
  2. ไปที่แอททริบิวตัวตรวจสอบ
  3. ไปที่ตัวแยกและเปลี่ยนเป็น"แทรกแบบกำหนดเอง"
  4. ตั้งค่าleftและ / หรือrightฟิลด์ (โดยค่าเริ่มต้นleft: 15, right: 0)

ดูวิธีการใช้งาน (โดยใช้left: 100):

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์:

ป้อนคำอธิบายรูปภาพที่นี่


1
ซ้ำจากคำตอบก่อนหน้าจาก @Hannah Louisa Carney
Konstantin Salavatov

19

ฉันได้รับจากUITableViewControllerและจำเป็นต้องเพิ่มเติมการตั้งค่า insets ทั้งสองในwillDisplayCellการตั้งค่าpreservesSuperviewLayoutMarginsเป็นเท็จ ใน Swift ดูเหมือนว่า:

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
โปรดทราบว่าการดำเนินการนี้จะไม่ปรับตัวคั่นในเซลล์ 'ตัวยึดตำแหน่ง' ที่แสดงโดยตัวควบคุมเพื่อเติมมุมมองด้านล่างเซลล์ของคุณหากเซลล์ของคุณไม่ได้สร้างความสูงเต็ม
Tieme

11

ตัวคั่นInsetเป็นค่าเริ่มต้น 15 จากซ้าย เปลี่ยนแยกInsetตัวเลือกจากautoไปและกำหนดสิ่งที่ใส่เข้าไปเพื่อcustom0

ป้อนคำอธิบายรูปภาพที่นี่


9

สำหรับ Swift ใน iOS 9+

หากใช้แบบกำหนดเองUITableViewCell:

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

จากนั้นสำหรับคุณUITableViewในviewDidLoad:

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

นี่เป็นคำตอบเดียวที่แก้ไขให้ฉัน (อัปเดตเป็น swift 3) อย่างไรก็ตาม ... มันทำงานเมื่อมีข้อมูลในเซลล์ สำหรับเซลล์ว่างที่ยังไม่ได้ถูกเติม (และฉันเดาว่ายังไม่ได้เรียกตัวแปร overMath layoutMargins นี้) ตัวคั่นยังไม่เติมเต็มความกว้างเต็มของเซลล์ที่กำหนดเองของฉันใน tableview ความคิดใด ๆ
RanLearns

บน iPhone ตัวคั่นสิ้นสุดลงเพียงไม่กี่พิกเซลจากด้านซ้ายและไม่กี่พิกเซลจากด้านขวาในเซลล์ว่าง นั่นดูไม่เป็นไรโดยไม่ต้องใช้เคล็ดลับนี้เพื่อลดระยะขอบ บน iPad เป็นปัญหาที่แท้จริง - ตัวคั่นในเซลล์ว่างไปจากขอบด้านซ้ายของมุมมอง tableview เพียง 80% ของความกว้างของเซลล์ เมื่อมีข้อมูลในเซลล์ตัวคั่นจะยังคง 80% ของความกว้างของเซลล์ แต่จะเริ่ม 20% ของวิธีการในและไปตลอดทางจนถึงขอบด้านขวาของมุมมองของตาราง
RanLearns

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 และ Swift 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

ไม่มีข้อใดถูกใช้งานได้สำหรับฉันใน Swift 2.2 และ Xcode 7.3.1

กลายเป็นทางออกที่ง่ายที่สุดของทั้งหมด ไม่จำเป็นต้องใช้รหัส เพียงแค่เปลี่ยนTableViewCellค่าระยะขอบเค้าโครงในUITableViewสารวัตรของคุณ:


4

สำหรับ Swift 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
    }
}


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ซึ่งเป็นระดับผู้ปกครองของทั้งสองและUITableViewUITableViewCell


1
ทางออกเดียวที่สามารถใช้งานได้ฉันพบสำหรับเซลล์ที่ไม่สามารถนำกลับมาใช้ใหม่ได้
Mickey

0

swift 5, Xcode 11 อัพเดท

วางสิ่งนี้ไว้ข้างใน viewDidLoad ()

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

สำหรับ edge to edge separator เพียงตั้งค่าซ้ายและขวาเป็น 0

โดยวิธีการเปลี่ยน "yourTableView" เป็นชื่อ OutletView tableView ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.