Ẩn dòng phân cách trên một UITableViewCell


250

Tôi đang tùy chỉnh a UITableView. Tôi muốn ẩn dòng phân cách trên ô cuối cùng ... tôi có thể làm điều này không?

Tôi biết tôi có thể làm tableView.separatorStyle = UITableViewCellStyle.Nonenhưng điều đó sẽ ảnh hưởng đến tất cả các ô của bảngView. Tôi muốn nó chỉ ảnh hưởng đến tế bào cuối cùng của tôi.



Câu hỏi của bạn đã trả lời của tôi. tableView.separatorStyle = UITableViewCellStyle. Đây là dòng tôi cần
Malachi Holden

Câu trả lời:


371

trong viewDidLoad, thêm dòng này:

self.tableView.separatorColor = [UIColor clearColor];

và trong cellForRowAtIndexPath:

dành cho iOS phiên bản thấp hơn

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

dành cho iOS 7 phiên bản cao hơn (bao gồm iOS 8)

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

4
Điều này sẽ hoạt động trên iOS7 và iOS8. Nó có hiệu quả ép dải phân cách xuống không. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bound) /2.0, 0, CGRectGetWidth (cell.bound) /2.0)
Harris

9
Một nhắc nhở: Khi iDevice của bạn là iPad và ô được sử dụng AutoLayout, giá trị được trả về bởi "cell.bound.size. Thong" có thể không bằng chiều rộng của ô thực tế. Vì vậy, tôi luôn luôn sử dụng "tableView.frame.size. Thong" thay vì "cell.bound.size. Thong".
Veight Zhou

5
Xin lưu ý: bạn nên sử dụng [cell.contentView addSubview:line]thay vì[cell addSubview:line]
Anastasia

6
thay đổi cell.separatorInset inset bên trái cũng sẽ thay đổi inset bên trái của nội dung ô. Không chỉ là đường phân cách. Từ apple doc: "Bạn có thể sử dụng thuộc tính này để thêm khoảng trắng giữa nội dung của ô hiện tại và cạnh trái và phải của bảng. Giá trị chèn tích cực di chuyển nội dung ô và dấu tách ô vào trong và ra khỏi các cạnh của bảng."
zgjie

9
Ý kiến ​​tồi. Bạn không bao giờ nên thêm các cuộc phỏng vấn vào một tế bào trong cellForRowAtIndexPath. Hãy nhớ rằng các tế bào được tái sử dụng. Mỗi khi ô này được sử dụng lại, bạn sẽ thêm chế độ xem dòng phân cách khác. Trên danh sách lớn, điều này có thể ảnh hưởng đến hiệu suất cuộn. Và đó không phải là cách đúng đắn để làm điều đó.
Dave Batton

247

Bạn có thể sử dụng mã sau đây:

Swift:

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

hoặc là :

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

cho ký quỹ mặc định:

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

để hiển thị dấu phân cách từ đầu đến cuối

cell.separatorInset = .zero

Mục tiêu-C:

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

Không làm việc cho một nhóm UITableView, trong khi câu trả lời được chấp nhận.
Aleks N.

3
Điều này không hoạt động cho iOS9, đã self.tableView.separatorColor = [UIColor clearColor];sửa nó.
Ben

1
Đây là một bản hack hoàn chỉnh nhưng những gì hoạt động trong iOS 9 là: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer

Đây là cách nó hoạt động với tôi trong iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);Nếu tôi không trừ giá trị cell.layoutMargins.left, đường phân cách được vẽ từ viền trái sang lề trái (nếu bạn có bất kỳ).
Hệ điều hành Alexandre

3
Điều này đẩy bất kỳ textLabelra khỏi màn hình.
aehlke

99

Để theo dõi câu trả lời của Hiren .

trong ViewDidLoad và dòng sau:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Hoặc, nếu bạn đang sử dụng XIB hoặc Storyboards, hãy thay đổi " dấu phân cách " thành " không ":

Xây dựng giao diện

Và trong CellForRowAtIndexPath thêm điều này:

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];

Dưới đây là một ví dụ về kết quả mà tôi hiển thị chế độ xem bảng với các ô động (nhưng chỉ có một ô duy nhất có nội dung). Kết quả là chỉ có một người có dải phân cách và không phải tất cả các chế độ xem bảng "giả" sẽ tự động thêm vào để lấp đầy màn hình.

nhập mô tả hình ảnh ở đây

Hi vọng điêu nay co ich.

EDIT: Đối với những người không luôn đọc các bình luận, thực sự có một cách tốt hơn để làm điều đó với một vài dòng mã:

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

Tôi nghĩ, để che giấu đường phân cách, đây là cách tiếp cận đúng. self.tableView.separatorStyle = .none
arango_86

52

Nếu bạn không muốn tự vẽ dải phân cách, hãy sử dụng:

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

API này chỉ có sẵn bắt đầu từ iOS 7.


8
separatorInsetdường như chèn nội dung ô cũng như dấu phân cách, yêu cầu một lần hack khác để bù lại:cell.IndentationWidth = -10000;
crishoj

23
Phương pháp tốt hơn là đặt separatorInsetthành 0 cho trên cùng, bên trái và dưới cùng và chiều rộng ô cho bên phải: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); Điều này tránh cần phải điều chỉnh bất kỳ thuộc tính ô nào khác.
bryguy1300

Nếu bạn đang sử dụng chiều rộng giới hạn ô cho hình nhỏ, bạn có thể cần tính toán lại khi giao diện xoay.
AndrewR

Lưu ý rằng nếu ô bạn làm điều này được sử dụng lại để vẽ một ô khác mà bạn không có ý định ẩn dấu phân cách thì dấu phân cách cũng sẽ biến mất khỏi nó.
Michael Peterson

1
UIEdgeInsetsMake (0, 10000, 0, 0); đã làm việc -> UIEdgeInsetsMake (0, 0, 0, cell.bound.size. thong); đã không. đoán đó là nguyên nhân khiến tôi có thói quen khó chịu khi giữ các vcs có kích thước 3,5 in trong xibs và styoryboard tạo ra trên các thiết bị 4 "+ gây ra phần 375-320px = 55px. (bằng giọng yoda) và nó rất xấu xí!
Anton Tropashko

29

môi trường phát triển của tôi là

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

câu trả lời trên không hoàn toàn làm việc cho tôi

Sau khi thử, giải pháp cuối cùng của tôi là:

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

và hiệu quả là: nhập mô tả hình ảnh ở đây


20

Đặt separatorInset.right = .greatestFiniteMagnitudetrên di động của bạn.


việc gọi này awakeFromNibcó thể khiến toàn bộ màn hình bật sángapplicationDidBecomeActive
Breadbin

Điều này hoạt động iOS 12.2, trên thiết bị, từ việc tạo UITableViewCell có lập trình. Đẹp.
Womble

Cài đặt dấu tách phải hoạt động với tôi khi tôi đặt nó trong cellForRowAt. Các giải pháp tốt nhất. Nó hoạt động từ iOS 10 đến 13 đối với tôi. Đã thử nghiệm trên iOS 10, 12 và 13. Khi lề trái được đặt thì nó không hoạt động cho iOS 10.
Ariel Bogdziewicz

18

Trong Swift 3, Swift 4 và Swift 5 , bạn có thể viết một phần mở rộng cho UITableViewCell như thế này:

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

Sau đó, bạn có thể sử dụng điều này như dưới đây (khi ô là ví dụ ô của bạn):

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

Nó thực sự tốt hơn khi gán độ rộng của ô xem bảng dưới dạng bên trái thay vì gán cho nó một số ngẫu nhiên. Bởi vì trong một số kích thước màn hình, có thể không phải bây giờ nhưng trong tương lai, dấu phân cách của bạn vẫn có thể hiển thị vì số ngẫu nhiên đó có thể không đủ. Ngoài ra, trong iPad ở chế độ ngang, bạn không thể đảm bảo rằng các dấu phân cách của bạn sẽ luôn ở chế độ ẩn.


Điều này không hoạt động cho UITableView theo nhóm. Bạn có giải pháp cho trường hợp nhóm?
zslavman

8

Giải pháp tốt hơn cho 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);
    }
}

Nếu ứng dụng của bạn có thể xoay được - hãy sử dụng 3000.0f cho hằng số chèn bên trái hoặc calc nó khi đang di chuyển. Nếu bạn cố gắng đặt bên phải, bạn có thể thấy phần phân cách ở bên trái của ô trên iOS 8.


1
Tại sao nên sử dụng một số ngẫu nhiên khi bạn có thể làm một cái gì đó như thế này: MAX ([[UIScreen mainScreen] giới hạn] .size. Thong, [[UIScreen mainScreen] giới hạn] .size.height); để chắc chắn rằng nó luôn biến mất
Daniel Galasko

7

Trong iOS 7, trình phân tách ô theo kiểu UITableView có vẻ hơi khác. Nó trông giống như thế này:

nhập mô tả hình ảnh ở đây

Tôi đã thử câu trả lời của Kemenaran khi làm điều này:

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

Tuy nhiên, điều đó dường như không làm việc cho tôi. Tôi cung không chăc tại sao. Vì vậy, tôi quyết định sử dụng câu trả lời của Hiren , nhưng sử dụng UIViewthay vì UIImageViewvà vẽ đường thẳng theo kiểu 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];
}

Nếu bạn sử dụng điều này, hãy đảm bảo bạn cắm đúng chiều cao của bảng xem trong câu lệnh if thứ hai. Tôi hy vọng điều này hữu ích cho một ai đó.


7

Trong lớp con UITableViewCell của bạn, ghi đè layoutSubview và ẩn _UITableViewCellSeparatorView. Hoạt động trong iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

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

không có giải pháp nào ở trên hoạt động ,, điều này hoạt động trên ios 12
Abdul Waheed

Điều này có thể bị từ chối từ App Store để truy cập API riêng.
Elliot Fiske

5

Tôi không tin rằng phương pháp này sẽ hoạt động trong mọi trường hợp với các tế bào động ...

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

Không quan trọng bạn thực hiện phương thức xem bảng nào cho các ô động, ô mà bạn đã thay đổi thuộc tính nội bộ sẽ luôn có thuộc tính nội bộ được đặt ngay bây giờ mỗi khi nó bị mất dữ liệu gây ra sự phân tán của các dấu tách dòng bị thiếu ... Đó là cho đến khi bạn tự thay đổi nó

Một cái gì đó như thế này làm việc cho tôi:

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)
}

Bằng cách đó, bạn cập nhật trạng thái cấu trúc dữ liệu của bạn ở mỗi lần tải


4

Trong Swift sử dụng 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)
    }
}

Lưu ý: đoạn mã trên đây sẽ hoạt động trên UITableView bằng cách sử dụng các ô động. Vấn đề duy nhất mà bạn có thể gặp phải là khi bạn sử dụng các ô tĩnh với các danh mục, loại phân tách khác với không có và kiểu được nhóm cho chế độ xem bảng. Trong thực tế, trong trường hợp cụ thể này, nó sẽ không ẩn ô cuối cùng của mỗi loại. Để khắc phục điều đó, giải pháp mà tôi tìm thấy là đặt dấu tách ô (thông qua IB) thành không và sau đó tạo và thêm thủ công (thông qua mã) chế độ xem dòng của bạn vào từng ô. Ví dụ: vui lòng kiểm tra đoạn mã dưới đây:

/*
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)
    }
}

Trong dự án của tôi, điều này hoạt động cho các ô tĩnh nhưng không cho các ô động. Trong trường hợp sau, nội dung của ô cuối cùng được dịch sang phải (giống như dòng phân cách). Bất kỳ ý tưởng, tại sao điều này có thể xảy ra?
Bastian

Đoạn mã đầu tiên của câu trả lời ở trên sẽ hoạt động trên UITableView bằng cách sử dụng các ô động. Vấn đề duy nhất mà bạn có thể gặp phải là khi bạn sử dụng các ô tĩnh với các danh mục, loại phân tách khác với không có và kiểu được nhóm cho chế độ xem bảng. Trong thực tế, trong trường hợp cụ thể này, nó sẽ không ẩn ô cuối cùng của mỗi loại. Để khắc phục điều đó, giải pháp mà tôi tìm thấy là đặt dấu tách ô (thông qua IB) thành không và sau đó tạo và thêm thủ công (thông qua mã) chế độ xem dòng của bạn vào từng ô. Ví dụ, vui lòng kiểm tra đoạn mã thứ hai của câu trả lời ở trên.
King-Wizard

nó chuyển văn bản (tiêu đề), rất vô dụng!
dùng155

4

Sử dụng lớp con này, bộ separatorInsetkhông hoạt động cho iOS 9.2.1, nội dung sẽ bị nén.

@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

Đơn giản và hợp lý hơn nhiều là làm điều này:

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

Trong hầu hết các trường hợp, bạn không muốn chỉ nhìn thấy dấu phân cách bảngCiewCell cuối cùng. Và cách tiếp cận này chỉ xóa phần tách bảngViewCell cuối cùng và bạn không cần phải suy nghĩ về các vấn đề tự động thanh toán (tức là thiết bị quay) hoặc các giá trị mã cứng để thiết lập các phần tử phân tách.


1
Chào mừng bạn đến với Stack Overflow! Một câu trả lời tốt hơn cho độc giả trong tương lai sẽ giải thích tại sao điều này đơn giản và hợp lý hơn.
CGritton

một giải pháp tốt đẹp!
geek1706

3

Trong willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

3

Sử dụng Swift 3 và áp dụng phương pháp hack nhanh nhất, bạn có thể cải thiện mã bằng các tiện ích mở rộng :

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)
            }
        }
    }

}

Sau đó, khi bạn định cấu hình ô:

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

Cách tốt nhất để đạt được điều này là tắt các dấu tách dòng mặc định, lớp con UITableViewCellvà thêm một dấu tách dòng tùy chỉnh làm phần phụ của contentView- xem bên dưới một ô tùy chỉnh được sử dụng để trình bày một đối tượng loại SNStockcó hai thuộc tính chuỗi tickername:

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()
  } 
}

Để vô hiệu hóa sử dụng dấu phân cách dòng mặc định , tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Phía người tiêu dùng tương đối đơn giản, xem ví dụ dưới đây:

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

Dành cho Swift 2:

thêm dòng sau vào viewDidLoad():

tableView.separatorColor = UIColor.clearColor()

2

nếu câu trả lời được chấp nhận không hoạt động, bạn có thể thử điều này:

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

Thật tuyệt vời ;)


1

Hãy thử mã dưới đây, có thể giúp bạn giải quyết vấn đề của bạn

- (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

Bạn phải lấy ô tùy chỉnh và thêm Nhãn và đặt ràng buộc, chẳng hạn như nhãn sẽ bao phủ toàn bộ khu vực ô. và viết dòng dưới đây trong constructor.

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

Đồng thời đặt lề Bố cục UITableView như sau

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

Tôi không thể ẩn dấu phân cách trên một ô cụ thể ngoại trừ sử dụng cách giải quyết sau

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

1

Đối với iOS7 trở lên, cách sạch hơn là sử dụng INFINITY thay vì giá trị được mã hóa cứng. Bạn không phải lo lắng về việc cập nhật ô khi màn hình xoay.

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

3
Được cảnh báo: Sử dụng INFINITY gây ra ngoại lệ thời gian chạy trên iOS9
AndrewR

1

Như (nhiều) người khác đã chỉ ra, bạn có thể dễ dàng ẩn tất cả các dấu tách UITableViewCell bằng cách tắt chúng cho toàn bộ UITableView; ví dụ: trong UITableViewControll của bạn

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

Thật không may, đó là một PITA thực sự để làm trên cơ sở từng tế bào , đó là những gì bạn đang thực sự yêu cầu.

Cá nhân, tôi đã thử rất nhiều hoán vị thay đổi cell.separatorInset.left, một lần nữa, như (nhiều) người khác đã đề xuất, nhưng vấn đề là, để trích dẫn Apple (nhấn mạnh thêm):

" ... Bạn có thể sử dụng thuộc tính này để thêm khoảng trắng giữa nội dung của ô hiện tại và cạnh trái và phải của bảng. Giá trị chèn tích cực di chuyển nội dung ô và dấu tách ô vào trong và ra khỏi các cạnh của bảng ... "

Vì vậy, nếu bạn cố gắng 'ẩn' dấu phân cách bằng cách đẩy nó ra khỏi màn hình bên phải, cuối cùng bạn cũng có thể thụt lề nội dung của ô của bạn. Theo đề xuất của crifan, sau đó bạn có thể cố gắng bù đắp cho tác dụng phụ khó chịu này bằng cách cài đặt cell.indentationWidthcell.indentationLevel thích hợp để di chuyển mọi thứ trở lại, nhưng tôi thấy điều này cũng không đáng tin cậy (nội dung vẫn bị thụt vào ...).

Cách đáng tin cậy nhất mà tôi đã tìm thấy là lái xe quá mức layoutSubviewstrong một lớp con UITableViewCell đơn giản và đặt phần bên phải để nó chạm vào phần bên trái, làm cho dấu phân cách có độ rộng 0 và vô hình [điều này cần được thực hiện trong layoutSubview để tự động xử lý các vòng quay]. Tôi cũng thêm một phương thức tiện lợi vào lớp con của mình để bật cái này lên.

@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

Hãy cẩn thận: không có cách nào đáng tin cậy để khôi phục phần bên phải ban đầu , vì vậy bạn không thể "ẩn" dấu phân cách, do đó tại sao tôi sử dụng một hideSeparatorphương pháp không thể đảo ngược (so với phơi bày dấu phân cách). Vui lòng lưu ý Dấu phân cách vẫn tồn tại trên các ô được sử dụng lại, vì vậy, vì bạn không thể 'ẩn', bạn cần giữ các ô phân cách ẩn này được phân lập trong trình tái sử dụng riêng của chúng.


1

Yêu cầu của tôi là ẩn dấu phân cách giữa ô thứ 4 và thứ 5. Tôi đã đạt được nó bằng cách

    -(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

Nhanh:

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
}

Mục tiêu-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

Bên trong lớp tế bào bàn. đặt những dòng mã này

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

Không tính đến sự thay đổi bố cục thiết bị / cảnh.
Womble

0

Trên iOS9, tôi gặp vấn đề là việc thay đổi các dấu phân cách cũng ảnh hưởng đến việc định vị văn bản và chi tiết.

Tôi đã giải quyết nó bằng cái này

override func layoutSubviews() {
    super.layoutSubviews()

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

Không hoạt động với lớp UITableViewCell - TextLabel và Chi tiết TexLabel di chuyển khỏi ô.
Nik Kov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.