ซ่อนบรรทัดตัวแยกในหนึ่ง UITableViewCell


250

UITableViewผมปรับแต่ง ฉันต้องการซ่อนเส้นคั่นบนเซลล์สุดท้าย ... ฉันจะทำสิ่งนี้ได้ไหม

ฉันรู้ว่าฉันสามารถทำได้tableView.separatorStyle = UITableViewCellStyle.Noneแต่นั่นจะมีผลกับเซลล์ทั้งหมดของ tableView ฉันต้องการให้มันมีผลกับเซลล์สุดท้ายของฉันเท่านั้น



คำถามของคุณตอบฉันแล้ว tableView.separatorStyle = UITableViewCellStyle.None เป็นบรรทัดที่ฉันต้องการ
มาลาคีโฮลเดน

คำตอบ:


371

ในviewDidLoadเพิ่มบรรทัดนี้:

self.tableView.separatorColor = [UIColor clearColor];

และในcellForRowAtIndexPath:

สำหรับ iOS เวอร์ชั่นที่ต่ำกว่า

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

สำหรับ iOS 7 เวอร์ชั่นสูงกว่า (รวมถึง iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

4
สิ่งนี้จะทำงานบน iOS7 และ iOS8 มันบีบตัวคั่นได้อย่างมีประสิทธิภาพลงไปที่ศูนย์ cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
แฮร์ริส

9
หนึ่งการเตือนความจำ: เมื่อ iDevice ของคุณเป็น iPad และใช้เซลล์ AutoLayout ค่าที่ส่งคืนโดย "cell.bounds.size.width" อาจไม่เท่ากับความกว้างของเซลล์จริง ดังนั้นฉันมักจะใช้ "tableView.frame.size.width" แทน "cell.bounds.size.width"
Veight Zhou

5
โปรดทราบ: คุณควรใช้[cell.contentView addSubview:line]แทน[cell addSubview:line]
Anastasia

6
เปลี่ยน cell.separatorInset สิ่งที่ใส่เข้าไปทางซ้ายจะเปลี่ยนส่วนที่เหลือของเนื้อหาในเซลล์ด้วย ไม่ใช่แค่เส้นแบ่ง จาก apple doc: "คุณสามารถใช้คุณสมบัตินี้เพื่อเพิ่มช่องว่างระหว่างเนื้อหาของเซลล์ปัจจุบันและขอบซ้ายและขวาของตารางค่าสิ่งที่ใส่เข้าไปบวกย้ายเนื้อหาของเซลล์และตัวคั่นเซลล์เข้าและออกจากขอบตาราง"
zgjie

9
ความคิดที่ไม่ดี คุณไม่ควรเพิ่ม subviews cellForRowAtIndexPathกับเซลล์ใน โปรดจำไว้ว่าเซลล์จะถูกนำมาใช้ซ้ำ ทุกครั้งที่เซลล์นี้ถูกนำกลับมาใช้ใหม่คุณจะเพิ่มมุมมองบรรทัดตัวแยกอื่น ในรายการขนาดใหญ่อาจมีผลต่อประสิทธิภาพการเลื่อน และมันก็ไม่ใช่วิธีที่ถูกต้องที่จะทำ
Dave Batton

247

คุณสามารถใช้รหัสต่อไปนี้:

รวดเร็ว:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

หรือ :

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

สำหรับระยะขอบเริ่มต้น:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

เพื่อแสดงตัวคั่นแบบ end-to-end

cell.separatorInset = .zero

Objective-C:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}

ไม่ทำงานสำหรับการจัดกลุ่มUITableViewในขณะที่คำตอบที่ยอมรับจะทำ
Aleks N.

3
ไม่สามารถใช้งานกับ iOS9 self.tableView.separatorColor = [UIColor clearColor];ได้
Ben

1
เป็นการแฮ็คที่สมบูรณ์ แต่สิ่งที่ใช้งานได้ใน iOS 9 คือ: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer

นี่เป็นวิธีที่ใช้ได้ผลกับฉันใน iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);หากฉันไม่ลบค่า cell.layoutMargins.left บรรทัดตัวคั่นจะถูกลากจากขอบด้านซ้ายไปยังระยะขอบด้านซ้าย (ถ้าคุณมี)
Alexandre OS

3
สิ่งนี้จะผลักดันtextLabelปิดหน้าจอใด ๆ
aehlke

99

ติดตามคำตอบของHiren

ในViewDidLoadและบรรทัดต่อไปนี้:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

หรือหากคุณใช้ XIB หรือ Storyboards ให้เปลี่ยน " separator " เป็น " none ":

เครื่องมือสร้างส่วนต่อประสาน

และในCellForRowAtIndexPathเพิ่มสิ่งนี้:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

นี่คือตัวอย่างของผลลัพธ์ที่ฉันแสดง tableview ด้วย Dynamic Cells (แต่มีเพียงอันเดียวที่มีเนื้อหา) ผลที่ตามมาคือมีเพียงตัวคั่นเท่านั้นและไม่ได้เพิ่มมุมมองแบบคน "จำลอง" ทั้งหมดลงในหน้าจอโดยอัตโนมัติ

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

หวังว่านี่จะช่วยได้

แก้ไข:สำหรับผู้ที่ไม่ได้อ่านความคิดเห็นเสมอไปมีวิธีที่ดีกว่าในการทำโค้ดสองสามบรรทัด:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}

ฉันคิดว่าเพื่อซ่อนเส้นแบ่งนี่เป็นแนวทางที่ถูกต้อง self.tableView.separatorStyle = .none
arango_86

52

หากคุณไม่ต้องการวาดตัวคั่นให้ใช้สิ่งนี้:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

API นี้ใช้งานได้เริ่มต้นจาก iOS 7 เท่านั้น


8
separatorInsetดูเหมือนว่าสิ่งที่ใส่เข้าไปเนื้อหามือถือได้เป็นอย่างดีเป็นตัวคั่นที่ต้องสับอีกเพื่อชดเชย:cell.IndentationWidth = -10000;
crishoj

23
วิธีที่ดีกว่าคือการตั้งค่าseparatorInsetเป็น 0 สำหรับด้านบนซ้ายและล่างและความกว้างของเซลล์ทางด้านขวา: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); วิธีนี้หลีกเลี่ยงการปรับคุณสมบัติของเซลล์อื่น ๆ
bryguy1300

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

โปรดทราบว่าหากเซลล์ที่คุณทำเช่นนี้ถูกนำกลับมาใช้ซ้ำเพื่อดึงเซลล์อื่นที่คุณไม่ได้ตั้งใจซ่อนตัวคั่นตัวคั่นจะหายไปจากตัวมันเอง
Michael Peterson

1
UIEdgeInsetsMake (0, 10000, 0, 0); ทำงาน -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); ไม่ได้. เดาว่าเป็นสาเหตุที่ทำให้ฉันมีนิสัยที่น่ารังเกียจในการรักษา 3.5 "vcs ขนาดใหญ่ใน xibs และสไตรีบอร์ดซึ่งสิ่งประดิษฐ์ในอุปกรณ์ 4" + ทำให้เกิด 375-320px section = 55px (ในเสียงโยดา) และน่าเกลียดมาก!
Anton Tropashko

29

สภาพแวดล้อมการพัฒนาของฉันคือ

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

คำตอบข้างต้นไม่ได้ผลเต็มที่สำหรับฉัน

หลังจากลองแก้ปัญหาการทำงานในที่สุดของฉันคือ:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

และผลคือ: ป้อนคำอธิบายรูปภาพที่นี่


20

ตั้งseparatorInset.right = .greatestFiniteMagnitudeอยู่บนมือถือของคุณ


การเรียกใช้สิ่งนี้awakeFromNibสามารถทำให้ทั้งหน้าจอกะพริบได้applicationDidBecomeActive
Breadbin

ใช้งานได้กับ iOS 12.2 บนอุปกรณ์จากการสร้าง UITableViewCell แบบเป็นโปรแกรม ดี
Womble

การตั้งค่าตัวคั่นขวาใช้งานได้สำหรับฉันเมื่อฉันตั้งค่าไว้ใน cellForRowAt ทางออกที่ดีที่สุด ใช้งานได้ตั้งแต่ iOS 10 ถึง 13 สำหรับฉัน ทดสอบกับ iOS 10, 12 และ 13 เมื่อตั้งค่าระยะขอบซ้ายแล้วจะไม่ทำงานสำหรับ iOS 10
Ariel Bogdziewicz

18

ในSwift 3, Swift 4 และ Swift 5คุณสามารถเขียนส่วนขยายไปยัง UITableViewCell ดังนี้:

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

จากนั้นคุณสามารถใช้สิ่งนี้ได้ด้านล่าง (เมื่อเซลล์เป็นอินสแตนซ์ของเซลล์):

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

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


สิ่งนี้ใช้ไม่ได้กับ UITableView แบบจัดกลุ่ม คุณมีวิธีแก้ปัญหาสำหรับกรณีและปัญหาหรือไม่?
zslavman

8

ทางออกที่ดีกว่าสำหรับ iOS 7 และ 8

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

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


1
ทำไมต้องใช้ตัวเลขสุ่มเมื่อคุณสามารถทำสิ่งนี้: MAX ([[UIScreen mainScreen] ขอบเขต] .size.width, [[UIScreen mainScreen] ขอบเขต] .size.height); เพื่อให้แน่ใจว่ามันจะหายไปเสมอ
Daniel Galasko

7

ใน iOS 7 ตัวคั่นเซลล์สไตล์ที่จัดกลุ่ม UITableView มีลักษณะแตกต่างกันเล็กน้อย ดูเหมือนว่าจะเป็นแบบนี้:

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

ฉันลองคำตอบของ Kemenaran ในการทำสิ่งนี้:

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

อย่างไรก็ตามนั่นไม่ได้ผลสำหรับฉัน ฉันไม่แน่ใจว่าทำไม ดังนั้นฉันจึงตัดสินใจใช้คำตอบของ Hiren แต่ใช้UIViewแทนUIImageViewและวาดเส้นในสไตล์ iOS 7:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

หากคุณใช้สิ่งนี้ตรวจสอบให้แน่ใจว่าคุณเสียบความสูงของมุมมองตารางที่ถูกต้องในคำสั่ง if ฉันหวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน


7

ในคลาสย่อย UITableViewCell ของคุณให้แทนที่ layoutSubviews และซ่อน _UITableViewCellSeparatorView ทำงานภายใต้ iOS 10

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}

วิธีการแก้ปัญหาข้างต้นไม่ได้ผล, ใช้งานได้กับ ios 12
Abdul Waheed

สิ่งนี้อาจถูกปฏิเสธจาก App Store เพื่อเข้าถึง API ส่วนตัว
Elliot Fiske

5

ฉันไม่เชื่อว่าวิธีการนี้จะทำงานภายใต้สถานการณ์ใด ๆ กับเซลล์แบบไดนามิก ...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

มันไม่สำคัญว่าวิธี tableview ใดที่คุณทำในเซลล์แบบไดนามิกเซลล์ที่คุณเปลี่ยนคุณสมบัติสิ่งที่ใส่เข้าไปจะมีการตั้งค่าคุณสมบัติสิ่งที่ใส่ไว้เสมอทุกครั้งที่ dequeued ก่อให้เกิดอาละวาดของตัวแยกบรรทัดที่หายไป ... นั่นคือจนกว่าคุณ เปลี่ยนมันเอง

บางสิ่งเช่นนี้ใช้ได้กับฉัน:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

วิธีนี้คุณจะอัพเดทสถานะโครงสร้างข้อมูลของคุณในทุก ๆ โหลด


4

ในSwiftโดยใช้iOS 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

หมายเหตุ: ตัวอย่างข้างต้นนี้จะทำงานบน UITableView โดยใช้เซลล์แบบไดนามิก ปัญหาเดียวที่คุณสามารถพบได้คือเมื่อคุณใช้สแตติกเซลล์ที่มีหมวดหมู่ตัวคั่นชนิดที่แตกต่างจากไม่มีและสไตล์ที่จัดกลุ่มสำหรับมุมมองตาราง ในความเป็นจริงในกรณีนี้มันจะไม่ซ่อนเซลล์สุดท้ายของแต่ละหมวดหมู่ สำหรับการเอาชนะนั้นโซลูชันที่ฉันพบคือตั้งตัวแยกเซลล์ (ผ่าน IB) เป็น none จากนั้นสร้างและเพิ่มมุมมองบรรทัดของคุณไปยังแต่ละเซลล์ด้วยตนเอง (ผ่านรหัส) ตัวอย่างเช่นโปรดตรวจสอบตัวอย่างด้านล่าง:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}

ในโครงการของฉันสิ่งนี้ใช้ได้กับเซลล์แบบสแตติก แต่ไม่ใช่แบบไดนามิก ในกรณีหลังเนื้อหาของเซลล์สุดท้ายจะถูกเลื่อนไปทางขวา (เช่นเดียวกับเส้นคั่น) ความคิดใด ๆ ทำไมสิ่งนี้อาจเกิดขึ้น
บาสเตียน

ตัวอย่างข้อมูลแรกของคำตอบด้านบนจะทำงานกับ UITableView โดยใช้เซลล์แบบไดนามิก ปัญหาเดียวที่คุณสามารถพบได้คือเมื่อคุณใช้สแตติกเซลล์ที่มีหมวดหมู่ตัวคั่นชนิดที่แตกต่างจากไม่มีและสไตล์ที่จัดกลุ่มสำหรับมุมมองตาราง ในความเป็นจริงในกรณีนี้มันจะไม่ซ่อนเซลล์สุดท้ายของแต่ละหมวดหมู่ สำหรับการเอาชนะนั้นโซลูชันที่ฉันพบคือตั้งตัวแยกเซลล์ (ผ่าน IB) เป็น none จากนั้นสร้างและเพิ่มมุมมองบรรทัดของคุณไปยังแต่ละเซลล์ด้วยตนเอง (ผ่านรหัส) ตัวอย่างเช่นโปรดตรวจสอบตัวอย่างที่สองของคำตอบข้างต้น
King-Wizard

มันเปลี่ยนข้อความ (ชื่อ) จึงไร้ประโยชน์!
user155

4

ใช้คลาสย่อยนี้ set separatorInsetไม่ทำงานสำหรับ iOS 9.2.1 เนื้อหาจะถูกบีบ

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://gist.github.com/liruqi/9a5add4669e8d9cd3ee9


4

ง่ายและตรรกะมากขึ้นคือการทำเช่นนี้:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [[UIView alloc] initWithFrame:CGRectZero]; }

ในกรณีส่วนใหญ่คุณไม่ต้องการเห็นเฉพาะตัวคั่น tableCiewCell ล่าสุด และวิธีการนี้จะลบเฉพาะตัวคั่น tableViewCell สุดท้ายเท่านั้นและคุณไม่จำเป็นต้องคิดถึงปัญหาการหาค่าอัตโนมัติ (เช่นอุปกรณ์ที่หมุนได้) หรือค่า hardcode เพื่อตั้งค่าตัวคั่นแบบแยก


1
ยินดีต้อนรับสู่ Stack Overflow! คำตอบที่ดีกว่าสำหรับผู้อ่านในอนาคตจะอธิบายว่าทำไมสิ่งนี้จึงเรียบง่ายและมีเหตุผลมากกว่า
CGritton

ทางออกที่ดี!
geek1706


3

การใช้สวิฟท์ 3และการนำที่เร็วที่สุดในการแฮ็ค-วิธีการที่คุณสามารถปรับปรุงการใช้รหัสนามสกุล :

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

จากนั้นเมื่อคุณกำหนดค่าเซลล์:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}

2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }

2

วิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คือปิดตัวแยกบรรทัดเริ่มต้นคลาสย่อยUITableViewCellและเพิ่มตัวคั่นบรรทัดแบบกำหนดเองเป็นมุมcontentViewมองย่อย - ดูด้านล่างเซลล์แบบกำหนดเองที่ใช้เพื่อแสดงวัตถุประเภทSNStockที่มีคุณสมบัติสตริงสองรายการtickerและname:

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

tableView.separatorStyle = UITableViewCellSeparatorStyle.None;การปิดใช้งานการใช้คั่นเส้นค่าเริ่มต้น ด้านผู้บริโภคค่อนข้างง่ายดูตัวอย่างด้านล่าง:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}


2

หากคำตอบที่ยอมรับใช้ไม่ได้คุณสามารถลองทำสิ่งนี้:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

มันยอดเยี่ยม;)


1

ลองใช้รหัสด้านล่างอาจช่วยให้คุณแก้ไขปัญหาได้

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}

1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}

1

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

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

ตั้งค่าระยะขอบเค้าโครง UITableView ดังต่อไปนี้

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

ฉันไม่สามารถซ่อนตัวคั่นในเซลล์ที่ระบุยกเว้นการใช้วิธีแก้ปัญหาต่อไปนี้

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}

1

สำหรับ iOS7 ขึ้นไปวิธีที่สะอาดกว่าคือการใช้ INFINITY แทนค่าฮาร์ดโค้ด คุณไม่ต้องกังวลกับการอัพเดตเซลล์เมื่อหน้าจอหมุน

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}

3
ถูกเตือน: การใช้ INFINITY ทำให้เกิดข้อยกเว้นรันไทม์บน iOS9
AndrewR

1

ในฐานะที่เป็น (คนจำนวนมาก) คนอื่น ๆ ได้ชี้ให้เห็นคุณสามารถซ่อนตัวคั่น UITableViewCell ทั้งหมดได้อย่างง่ายดายโดยเพียงแค่ปิดมันสำหรับ UITableView ทั้งหมด เช่นใน UITableViewController ของคุณ

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

แต่น่าเสียดายที่มันเป็น PITA ที่แท้จริงในการทำต่อเซลล์ซึ่งเป็นสิ่งที่คุณต้องการจริงๆ

โดยส่วนตัวแล้วฉันได้ลองเปลี่ยนวิธีมากมายในการเปลี่ยนcell.separatorInset.leftอีกครั้งตามที่คนอื่น ๆ ได้แนะนำ แต่ปัญหาคือเพื่ออ้างถึง Apple (เน้นที่เพิ่ม):

" ... คุณสามารถใช้คุณสมบัตินี้เพื่อเพิ่มช่องว่างระหว่างเนื้อหาของเซลล์ปัจจุบันและขอบซ้ายและขวาของตารางค่าสิ่งที่ใส่เข้าไปบวกย้ายเนื้อหาของเซลล์และตัวคั่นเซลล์เข้าและออกจากขอบโต๊ะ ... "

ดังนั้นหากคุณพยายาม 'ซ่อน' ตัวคั่นโดยเลื่อนหน้าจอไปทางขวาคุณสามารถท้ายเนื้อหาของเซลล์ของคุณด้วยเช่นกัน ตามที่แนะนำโดย crifan คุณสามารถลองชดเชยผลข้างเคียงที่น่ารังเกียจนี้โดยการตั้งค่าcell.indentationWidthและcell.indentationLevelย้ายทุกอย่างกลับคืนมาอย่างเหมาะสม แต่ฉันพบว่าสิ่งนี้ไม่น่าเชื่อถือ (เนื้อหายังคงได้รับการเยื้อง ... )

วิธีที่น่าเชื่อถือที่สุดที่ฉันค้นพบคือ over-ride layoutSubviewsใน subclass UITableViewCell ที่เรียบง่ายและตั้งค่าinset ขวาเพื่อให้มันชนกับ inset ด้านซ้ายทำให้ตัวคั่นมีความกว้าง 0 และมองไม่เห็น [สิ่งนี้ต้องทำใน layoutSubviews โดยอัตโนมัติ จัดการการหมุน] ฉันยังเพิ่มวิธีอำนวยความสะดวกให้กับคลาสย่อยของฉันเพื่อเปิดใช้งาน

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

Caveat: ไม่มีวิธีที่เชื่อถือได้ในการกู้คืนสิ่งที่ใส่เข้าไปทางด้านขวาของต้นฉบับดังนั้นคุณไม่สามารถ 'ยกเลิกการซ่อน' ตัวคั่นได้ดังนั้นทำไมฉันถึงใช้ตัวกลับไม่ได้hideSeparatorวิธีที่ (เทียบกับการเปิดเผยตัวคั่น) โปรดทราบว่า separatorInset ยังคงมีอยู่ในเซลล์ที่นำกลับมาใช้ใหม่ดังนั้นเนื่องจากคุณไม่สามารถ 'ยกเลิกการซ่อน' ได้คุณต้องแยกเซลล์ตัวแยกที่ซ่อนอยู่เหล่านี้ไว้ใน reuseIdentifier ของตัวเอง


1

ความต้องการของฉันคือการซ่อนตัวคั่นระหว่างเซลล์ที่ 4 และ 5 ฉันทำได้โดย

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}

1

สวิฟท์:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

Objective-C:

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}

1

ภายในคลาสเซลล์ tableview ใส่บรรทัดของรหัสเหล่านี้

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)

ไม่บัญชีสำหรับการเปลี่ยนแปลงเค้าโครงของอุปกรณ์ / ฉาก
Womble

0

บน iOS9 ฉันมีปัญหาที่การเปลี่ยนตัวคั่นตัวคั่นยังส่งผลต่อการวางตำแหน่งของข้อความ - และ detailLabel

ฉันแก้ไขมันด้วยสิ่งนี้

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}

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