Loại bỏ các dải phân cách bổ sung bên dưới UITableView


714

Khi tôi thiết lập chế độ xem bảng với 4 hàng, vẫn còn các dòng phân cách bổ sung (hoặc các ô trống thừa) bên dưới các hàng được điền.

Làm thế nào tôi có thể loại bỏ các tế bào?

hình ảnh cho các dòng phân cách bổ sung trong UITableView

Câu trả lời:


1505

Trình tạo giao diện (iOS 9+)

Chỉ cần kéo một UIView vào bàn. Trong bảng phân cảnh, nó sẽ ngồi ở trên cùng bên dưới các ô tùy chỉnh của bạn. Bạn có thể thích đặt tên nó là "chân trang".

Ở đây nó được hiển thị bằng màu xanh lá cây cho rõ ràng, bạn có thể muốn màu sắc rõ ràng.

Lưu ý rằng bằng cách điều chỉnh chiều cao, bạn có thể ảnh hưởng đến cách xử lý "độ nảy dưới cùng" của bảng, tùy thích. (Chiều cao bằng 0 thường ổn).

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


Để làm điều đó theo chương trình:

Nhanh

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

Mục tiêu-C

iOS 6.1 trở lên

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

hoặc nếu bạn thích,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Trong lịch sử trong iOS:

Thêm vào bộ điều khiển xem bảng ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

và nếu cần ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}

Tôi nghĩ rằng mô tả của bạn và mã của bạn được đảo ngược. Dù sao, điều này làm việc rất tốt cho tôi. Tôi chỉ sử dụng chân trang "thực" với các bảng được nhóm, vì vậy tôi đã thêm if (tableView.style! = UITableViewStylegrouped) {} ​​xung quanh mã của bạn. Bây giờ tất cả các bảng không được nhóm của tôi mất các ô bổ sung, trong khi các bảng được nhóm của tôi không bị ảnh hưởng.
arlomedia

Theo ghi chú của tôi ở trên, tôi sẽ thêm một cảnh báo rằng nếu bạn đặt bất kỳ điều kiện nào vào phương thức viewForFooterInSection, hãy chắc chắn rằng phương thức đó trả về một UIView hoặc nil. Nếu bạn vô tình trở về void, ứng dụng của bạn sẽ bị sập!
arlomedia

4
@Mathieu Điều này sẽ hoạt động vì nếu bảng có chân trang tùy chỉnh, nó sẽ không tạo các hàng "fantom" để điền vào bảng xem. Vì vậy, trong bạn sẽ tạo một chế độ xem trống để được sử dụng làm chân trang và đặt chiều cao thành gần 0 (không thể bằng 0 hoặc iOS sẽ không hiển thị nó). Với thủ thuật đơn giản này, bạn sẽ thay đổi hành vi mặc định.
J. Costa

2
@ j.Costa: Giải pháp của bạn sẽ chỉ hoạt động một lần trong khi uitableview được tạo. Sau khi nhấp vào ô cuối cùng, giải pháp của bạn không tốt hơn. hãy cải thiện câu trả lời của bạn

3
Sử dụng tableFooterViewđể lại một dấu phân cách trên ô cuối cùng trong hàng, vì bảng vẫn dự đoán nội dung bên dưới ô đó. Sử dụng cách lịch sử sẽ loại bỏ phân cách cuối cùng đó và nhìn tổng thể tốt hơn.
James Kuang

128

Đây là một cách khác để thực hiện điều đó theo kiểu bảng được nhóm và có thể bạn không đoán được. Thêm một tiêu đề và chân trang vào bảng (có thể là một hoặc các điều kiện khác, chưa được kiểm tra) làm cho các dấu phân cách biến mất khỏi các hàng điền / hàng trống.

Tôi tình cờ phát hiện ra điều này vì tôi muốn có một khoảng trống nhỏ ở đầu và cuối bàn để giảm nguy cơ nhấn nút thay vì một ô bảng bằng ngón tay có thịt. Đây là một phương pháp để gắn một chế độ xem trống dưới dạng đầu trang và chân trang. Sử dụng bất kỳ chiều cao nào bạn thích, bạn vẫn loại bỏ các đường phân cách phụ.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

Để trả lời @Casebash, tôi đã quay lại mã trong ứng dụng của mình (Trình quản lý danh sách "AcmeLists" trong cửa hàng iTunes ...) và sử dụng ngắn gọn phương thức addHeaderAndFooter để xác minh. Không có nó , tôi có các dải phân cách thêm; với mã, tôi có những gì bạn nhìn thấy trong cửa sổ này: không có hình ảnh phân tách hàng của bảng . Vì vậy, tôi không chắc tại sao nó sẽ không làm việc cho bạn. Hơn nữa, nó có ý nghĩa với tôi rằng có bất kỳ chân trang tùy chỉnh nào trên chế độ xem bảng sẽ nhất thiết phải dừng vẽ các dấu phân cách hàng cho các hàng trống bên dưới nó. Điều đó thật gớm ghiếc. Để tham khảo, tôi đã xem các bảng có nhiều hàng hơn có thể được xem trên màn hình và sau đó cho một bảng có hai hàng. Trong cả hai trường hợp, không có dải phân cách bên ngoài.

Có lẽ quan điểm tùy chỉnh của bạn không thực sự được thêm vào. Để kiểm tra điều đó, hãy đặt màu nền thành một cái gì đó khác clearColor, ví dụ , [UIColor redColor]. Nếu bạn không thấy một số thanh màu đỏ ở cuối bảng, chân trang của bạn sẽ không được đặt.


1
Bạn cũng có thể làm điều này trong IB. Chỉ cần kéo một UIView ở dưới cùng của TableView và đặt chiều cao thành 1.
Ortwin Gentz

70

Xóa các dòng phân cách bổ sung cho các hàng trống trong UITableView trong Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}

34

Tôi muốn mở rộng câu trả lời wkw :

Đơn giản chỉ cần thêm chân trang với chiều cao 0 sẽ thực hiện thủ thuật. (đã thử nghiệm trên sdk 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

hoặc thậm chí đơn giản hơn - nơi bạn thiết lập chế độ xem bảng của mình, hãy thêm dòng này:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

hoặc thậm chí đơn giản hơn - chỉ cần loại bỏ bất kỳ dấu phân cách nào:

[_tableView setTableFooterView:[UIView new]];

Cảm ơn wkw một lần nữa :)


Đây là câu trả lời đúng, vì trong các phương thức khác, hàng cuối cùng vẫn không có dấu phân cách dòng
Ankush

22

Dành cho iOS 7+ bằng Storyboards

Đơn giản chỉ cần kéo một UIViewvào UITableViewchân trang của bạn . Đặt chiều cao của chân trang thành 0.


18

Thử cái này. Nó làm việc cho tôi:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}

14

Dành cho Swift:

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

11

Nếu bạn đang sử dụng Swift, hãy thêm đoạn mã sau vào viewDidLoad của bộ điều khiển quản lý chế độ xem bảng:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}

8

Bạn chỉ có thể thêm một chân trang trống ở cuối, sau đó nó sẽ ẩn các ô trống nhưng nó cũng sẽ trông khá xấu xí:

tableView.tableFooterView = UIView()

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

Có một cách tiếp cận tốt hơn: thêm một dòng 1 điểm ở cuối chế độ xem bảng làm chân trang và các ô trống cũng sẽ không được hiển thị nữa.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

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


Đầu vào rất đẹp, tuy nhiên không cần phải tạo ô cuối cùng của bạn bằng màu phân cách dày ở phía dưới, thay vào đó chỉ cần làm cho nó có cùng màu nền của ô và nó cũng biến mất.
Gustavo Baiocchi Costa

Tuy nhiên, bạn thích. Nhưng tôi nghĩ rằng dải phân cách "chưa hoàn thành" trông khá xấu xí.
Darko


7

Thúc đẩy giải pháp của J. Costa: Bạn có thể thực hiện thay đổi toàn cầu cho bảng bằng cách đặt dòng mã này:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

bên trong phương thức có thể đầu tiên (thường là trong AppDelegate, trong: application:didFinishLaunchingWithOptions:phương thức).


2
Hãy cẩn thận với điều này, có những trường hợp chân trang dự định của bạn có thể bị ghi đè và bạn sẽ dành một hoặc hai ngày để đặt câu hỏi về sự tỉnh táo của bạn. Ngoài ra, tableFooterView không được đánh dấu bằng UI_APPEARANCE_SELECTOR để hành vi thực tế có thể thay đổi bất cứ lúc nào.
mwright 14/07/2015

6

Tôi biết Câu hỏi này đã được chấp nhận câu trả lời nhưng tôi đặt ở đây những cách khác nhau để làm thế nào để ẩn dòng phân cách Extra của UITableView.

Bạn có thể ẩn tableViewdòng phân cách tiêu chuẩn và thêm dòng tùy chỉnh của mình ở đầu mỗi ô.

Cập nhật:

Cách dễ nhất để thêm dấu phân cách tùy chỉnh là thêm đơn giản UIViewchiều cao 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

HOẶC LÀ

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

HOẶC LÀ

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

HOẶC Cách tốt nhất và đơn giản nhất mà tôi thích là

self.tableView.tableFooterView = [[UIView alloc] init];

Hãy thử bất kỳ một trong những;


6

Bạn có thể tìm thấy rất nhiều câu trả lời cho câu hỏi này. Hầu hết trong số họ xung quanh thao tác với UITableView's tableFooterViewthuộc tính và đây là cách thích hợp để ẩn các hàng trống. Để đảm bảo, tôi đã tạo tiện ích mở rộng đơn giản cho phép bật / tắt các hàng trống từ Trình tạo giao diện. Bạn có thể kiểm tra xem nó ra từ này ý chính tập tin. Tôi hy vọng nó có thể tiết kiệm một chút thời gian của bạn.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Sử dụng:

tableView.isEmptyRowsHidden = true

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


5

uitableview dòng phân cách bổ sung ẩn dòng phân cách bổ sung ẩn trong swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)

5

Nếu bạn không muốn có bất kỳ dấu phân cách nào sau ô cuối cùng, thì bạn cần chiều cao gần bằng 0 nhưng khác không cho chân trang của bạn.

Trong của bạn UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
tuyệt vời! Đã làm cho tôi!!
Antony Raphel


3

Chỉ cần thêm chế độ xem với màu phân cách mong muốn làm màu nền, chiều rộng 100%, chiều cao 1px ở vị trí x0 y-1 vào bảngViewCell của bạn. Hãy chắc chắn rằng bảngViewCell không clip xem xét, thay vào đó bảngView nên.

Vì vậy, bạn nhận được một dấu tách đơn giản và hoạt động tuyệt đối chỉ giữa các ô hiện có mà không có bất kỳ hack cho mỗi mã hoặc IB.

Lưu ý: Trên đỉnh nảy dọc, dải phân cách thứ 1 xuất hiện, nhưng đó không phải là vấn đề vì đó là hành vi mặc định của iOS.


3

Tôi đã sử dụng chế độ xem bảng để hiển thị một số hàng có chiều cao cố định, vì vậy tôi chỉ cần thay đổi kích thước của nó và làm cho nó không thể cuộn được.


3

Để loại bỏ các dòng phân cách bổ sung từ dưới cùng của UItableview theo chương trình, chỉ cần viết ra hai dòng mã sau và nó sẽ xóa phân tách bổ sung khỏi nó.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Thủ thuật này làm việc cho tôi mọi lúc, hãy thử bản thân mình.


2

Tôi đã có một số may mắn khi thực hiện một phần của câu trả lời được chấp nhận (iOS 9+, Swift 2.2). Tôi đã thử thực hiện:

self.tableView.tableFooterView = UIView(frame: .zero)

Tuy nhiên, không có ảnh hưởng gì đến tôi tableView- tôi tin rằng nó có thể có liên quan đến thực tế là tôi đang sử dụng UITableViewController.

Thay vào đó, tôi chỉ phải ghi đè viewForFooterInSectionphương thức (tôi không đặt phương thức tableFooterViewkhác):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Điều này hoạt động tốt cho một tableViewvới một phần duy nhất (nếu bạn có nhiều phần, bạn cần chỉ định phần cuối cùng).


2

Nếu bạn chỉ có một phần, thì cách nhanh nhất và dễ nhất là chỉ cần đặt Kiểu xem bảng từ "Đồng bằng" thành "Được nhóm". (xem hình)

GroupView được nhóm

Nếu bạn có nhiều phần hơn, bạn có thể cần đặt chiều cao tiêu đề thành 0 (tùy thuộc vào sở thích của bạn / khách hàng / người quản lý dự án của bạn)

Nếu bạn có nhiều phần hơn và không muốn gây rối với các tiêu đề (ngay cả khi đó chỉ là một dòng trong trường hợp đơn giản nhất), thì bạn cần đặt UIView làm chân trang, như đã được giải thích trong các câu trả lời trước)


2

Tiện ích mở rộng Swift 4.0

Chỉ cần một phần mở rộng cho bảng phân cảnh:

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

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}

2

Swift 4 cách nhanh chóng và dễ dàng.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Nếu bạn đang có các ô tĩnh. Bạn cũng có thể tắt dải phân cách từ cửa sổ Thanh tra. (điều này sẽ không được mong muốn nếu bạn cần thiết bị phân tách. Trong trường hợp đó, sử dụng phương pháp hiển thị ở trên) cửa sổ thanh tra


Đặt UIView mới cho tableFooterView đã được trả lời 10 lần, với các giải thích tốt hơn về lý do tại sao, mã tốt hơn (bạn đang thiếu super.viewDidLoad()) và được bao gồm trong câu trả lời wiki ở trên cùng. Đối với việc xóa tất cả các dấu phân cách, đó thực sự không phải là câu hỏi này, vì vậy tốt hơn là hoàn nguyên bản chỉnh sửa cuối cùng của bạn và / hoặc xóa hoàn toàn câu trả lời của bạn.
Cœur

1

Nếu bạn muốn xóa không gian không mong muốn trong UITableview, bạn có thể sử dụng hai phương pháp bên dưới

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}

1

Tôi đã thêm phần mở rộng xem bàn nhỏ này giúp xuyên suốt

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}

1

Hãy thử với điều này

cho mục tiêu C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

cho Swift

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

0

Thử cái này

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];

0

UIKitkhông tạo ô trống khi tableViewcó a tableFooterView. Vì vậy, chúng ta có thể thực hiện một mẹo và gán một UIViewđối tượng có chiều cao bằng không làm chân trang của tableView.

tableView.tableFooterView = UIView()

0

Trong trường hợp bạn có một searchbartrong của bạn view(để hạn chế số lượng kết quả chẳng hạn), bạn còn phải thêm những điều sau đây trong shouldReloadTableForSearchStringshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];

0

Trong Swift (Tôi đang sử dụng 4.0), bạn có thể thực hiện điều này bằng cách tạo ra một tùy chỉnh UITableViewCelllớp, và overridingcác setSelectedphương pháp. Sau đó separator insetstất cả về 0 . (lớp chính của tôi với chế độ xem bảng có màu nền rõ ràng).

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
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.