Cách đặt toàn bộ chiều rộng của dấu phân cách trong UITableView


149

Tôi có một UITableViewdải phân cách không có chiều rộng đầy đủ. Nó kết thúc như 10 pixel trước bên trái. Tôi đã chơi xung quanh với mã này trong viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Cũng trong bảng phân cảnh khi bạn có thể chọn bộ chọn tùy chỉnh hoặc mặc định. Bây giờ tất cả các ô được điền không có bộ chọn độ rộng đầy đủ nhưng các ô trống có chiều rộng đầy đủ.

Làm thế nào tôi có thể sửa lỗi này?


9
UITableViewcó một tài sản separatorInset. Đặt phần nhỏ của UITableViewdấu phân cách dòng thành 0. Ngoài ra, bạn có thể thay đổi separatorInsettừ bảng phân cảnh
KRUKUSA

Câu trả lời:


220

Điều này hoạt động với tôi trên các thiết bị iOS 8.4 - 9.0 sử dụng Xcode 6.4 và 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
}

Cập nhật Swift 5:

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

Tại sao điều này loại bỏ bảng của tôi với một bảng trống? Các bộ tách rời được di chuyển nhưng tôi không thể thấy bất kỳ nút nào của mình
Oscar

1
@James bạn có thể vui lòng giải thích "xóa bảng của tôi với một bảng trống không?". Làm thế nào bạn đã thêm các nút của bạn (thông qua IB, mã)?
MB_iOS Nhà phát triển 11/03/2016

1
Giải pháp rất hay. Nhưng trong trường hợp của tôi, tôi đặt mã thẳng vào khởi tạo ô, beacuse tôi muốn có toàn bộ chiều rộng của dải phân cách trong tất cả các bộ điều khiển.
Vojta

Trong trường hợp không rõ ràng, điều này cũng hoạt động với Objective-C với các thay đổi cú pháp phù hợp tất nhiên.
cohenadair

1
Không có giải pháp nào trong số này hoạt động trên iPad. Điều này chỉ hoạt động trên iPhone ...
Charles Robertson

103

Tôi đã nhận được câu trả lời từ bài đăng này: Dấu phân cách UITableView của iOS 8 không hoạt động

Chỉ cần thêm mã này vào 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
nó hoạt động với tôi khi chỉ thêm phương thức ủy nhiệm
bảngView

Tôi xin lỗi tôi đã không hiểu. Bạn có nghĩa là nó đã đủ để bạn thêm TableViewDeleagte?. Tôi vừa thử chỉ thêm rằng nó không hoạt động với tôi @TonyTony
Timo Cengiz

3
đối với tôi phương pháp viewDidLayoutSubviewsnày là không cần thiết
TonyTony

Bạn có thử chạy mã của mình với các phiên bản iOS khác 8 không? Có lẽ nó hoạt động cho những cái mới nhất. Nếu không thì tốt cho bạn rằng nó hoạt động. Tôi đã cố gắng chỉ thêm phương thức ủy nhiệm bàn và nó không giúp được gì. @TonyTony
Timo Cengiz

Tôi đã phải sử dụng cả hai. Tôi đã thử sử dụng từng cá nhân mà không thành công. Nó chỉ hoạt động khi tôi sử dụng cả hai. Ngoài ra, tôi đã thử nó khi trình điều khiển xem của tôi là một lớp con của UITableViewCont kiểm soát và khi nó là một lớp con của UIViewControll. Không khác nhau. Lưu ý rằng tôi đang chạy trong trình giả lập 8.1.
Ron

100

Trong bạn UITableViewCell

Chuyển đến Trình theo dõi thuộc tính trong Trình tạo giao diện của bạn và chỉ cần thay đổi "15" thành 0. Thực hiện việc này cho tất cả các ô bạn muốn thay đổi.

cài đặt

Bạn có thể cần thêm [cell setLayoutMargins:UIEdgeInsetsZero];vàotableViewCell


1
Hoặc đó là lạ. Điều này đã làm việc với tôi (cảm ơn bạn!) Trên các hàng nơi tôi có UITableViewCells được hiển thị, nhưng trên bất kỳ hàng trống nào bên dưới chúng, dấu phân cách vẫn được thụt lề 15 pixel.
Mike Gledhill

Nếu bạn đang sử dụng các ô tĩnh, tất cả những gì bạn cần là thay đổi phần bên trái thành 0 như được mô tả trong hình ảnh (Hoạt động trong iOS 10, Xcode 8.3.1)
Ignacio Valdivieso

29

cho Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

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

20
  1. Sự lựa chọn của bạn UITableViewCell
  2. Chuyển đến Thanh tra thuộc tính
  3. Chuyển đến Dấu phân cách và thay đổi nó thành "Phần tử tùy chỉnh"
  4. Đặt leftvà / hoặc rightcác trường. (Theo mặc định left: 15, right: 0)

Nhìn cách nó hoạt động (sử dụng left: 100):

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

Kết quả:

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


1
trùng lặp câu trả lời trước từ @Hannah Louisa Carney
Konstantin Salavatov

19

Tôi kế thừa từ UITableViewControllervà cần bổ sung vào hai cài đặt nội bộ willDisplayCellcũng được đặt preservesSuperviewLayoutMarginsthành false. Trong Swift có vẻ như thế này:

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

Bạn không cần đặt preservesSuperviewLayoutMargins = falsevì giá trị mặc định đã sai
crubio

2
Lưu ý rằng điều này sẽ không điều chỉnh các dấu phân cách trên các ô 'giữ chỗ' được hiển thị bởi bộ điều khiển để lấp đầy khung nhìn bên dưới các ô của bạn nếu các ô của bạn không tạo ra chiều cao đầy đủ.
Tieme

11

Dấu phân cách Insettheo mặc định là 15 từ trái sang. Thay đổi Insettùy chọn Dấu phân cách từ autothành customvà đặt hình nhỏ vào 0.

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


9

Dành cho Swift trong iOS 9+

Nếu sử dụng một tùy chỉnh UITableViewCell:

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

sau đó cho bạn UITableViewvào viewDidLoad:

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

Đây là câu trả lời duy nhất đã sửa nó cho tôi (cập nhật lên swift 3). Tuy nhiên ... nó hoạt động khi có dữ liệu trong ô. Đối với các ô trống chưa được điền (và tôi đoán chưa gọi là biến layoutMargins được ghi đè này), dấu phân cách vẫn không lấp đầy toàn bộ chiều rộng của ô tùy chỉnh của tôi trong chế độ xem bảng. Bất cứ ý tưởng về điều đó?
RanLearns

Trên iPhone, dấu phân cách kết thúc chỉ một vài pixel từ bên trái và một vài pixel từ bên phải trên các ô trống. Điều đó có vẻ ổn mà không cần sử dụng thủ thuật này để loại bỏ lề. Trên iPad là vấn đề thực sự - các dấu phân cách trên một ô trống đi từ cạnh trái của chế độ xem bảng, chỉ bằng khoảng 80% chiều rộng của ô. Khi có dữ liệu trong ô, dấu phân cách vẫn là 80% chiều rộng của ô, nhưng nó bắt đầu 20% đường vào và đi hết vào cạnh phải của chế độ xem bảng
RanLearns

1
Tìm ra một giải pháp ... bằng cách sử dụng if #av Available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} đã đưa ra để tôi không cần mã của bạn trên iPhone. Dải phân cách chỉ đi toàn bộ chiều rộng. Trên iPad, các ô trống có dấu tách chiều rộng đầy đủ, nhưng tôi cần mã của bạn để giữ toàn bộ chiều rộng khi dữ liệu được thêm vào. Mặt khác, có một vài pixel ở bên trái được thêm vào nơi không có dấu phân cách một khi dữ liệu lấp đầy ô.
RanLearns

1
Trả lời nơi tôi nhận được mã trong nhận xét ở trên từ: stackoverflow.com/a/31538250/428981
RanLearns

9

Đối với những người gặp sự cố với iPad - điều này sẽ đưa bạn vào trạng thái giống như iPhone. Sau đó bạn có thể điều chỉnh separatorInsetkhi cần thiết.

tableView.cellLayoutMarginsFollowReadableWidth = false

Đây là vấn đề của tôi trên iOS 10 so với iOS 11. iOS 11 vẫn ổn, nhưng 10 có tỷ suất lợi nhuận khác nhau. Cảm ơn!!!
migs647

9

Sử dụng nó trong cellForRowAtIndexPathphương thức, để định cấu hình thông số phân tách của ô,
nó hoạt động hoàn hảo cho iOS9.0 +

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

8

Đã thử nghiệm cho iOS 9.3 & Swift 2.2. Đảm bảo đặt mã willDisplayCellđược gọi ngay trước khi hiển thị ô chứ không phải ở cellForRowAtIndexPathnơi bạn chỉ tạo ô.

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

Thêm overridevào chức năng cho UITableViewController, như vậy:

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

5

Không có cái nào ở trên hoạt động với tôi trong Swift 2.2 và Xcode 7.3.1

Hóa ra là giải pháp đơn giản nhất trong tất cả. Không cần mã. Chỉ cần thay đổi TableViewCellgiá trị lề Bố cục trong trình UITableViewkiểm tra của bạn :


4

Dành cho 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
    }
}

1

Trong viewDidLoad(đã thử nghiệm iOS11 - swift 4.1)

thử

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


0

Không có giải pháp nào trong số này hoạt động trên iPad, nhưng tôi đã đưa ra một giải pháp bao gồm cả hai thiết bị:

Với các tế bào có thể tái sử dụng:

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

Với các tế bào không thể tái sử dụng:

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

Chỉ cần mở rộng về phương pháp này:

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

Cả hai thuộc tính có thể được sử dụng bởi UITableView& UITableViewCell. Trên thực tế, thứ hai là một thuộc tính của UIView, là lớp cha của cả hai UITableView& UITableViewCell.


1
Giải pháp khả thi duy nhất tôi tìm thấy cho các tế bào không thể tái sử dụng
Mickey

0

cập nhật nhanh 5, Xcode 11

đặt cái này bên trong viewDidLoad ()

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

đối với dấu phân cách cạnh sang cạnh chỉ cần đặt giá trị của trái và phải thành 0.

bằng cách thay đổi "yourTableView" thành tên OutletView của bảng.

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.