Могу ли я заставить UITableView скрывать разделитель между пустыми ячейками?

При использовании простого стиля UITableView с достаточно большим количеством ячеек, который UITableView не может отобразить их все без прокрутки, в пустое пространство под ячейками не появляются разделители. Если у меня есть только несколько ячеек, пустое пространство под ними включает разделители.

Есть ли способ, которым я могу заставить UITableView удалить разделители в пустом пространстве? Если нет, мне придется загрузить пользовательский фон с разделителем, нарисованным для каждой ячейки, что затруднит наследование поведения.

Я нашел несколько аналогичный вопрос здесь, но я не могу использовать сгруппированный UITableView в моей реализации.

Ответ 2

Для iOS 7. * и iOS 6.1

Самый простой способ - установить свойство tableFooterView:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
}

Для предыдущих версий

Вы можете добавить это в свой TableViewController (это будет работать для любого количества разделов):

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

и , если этого недостаточно, добавьте следующий код тоже:

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

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

Ответ 3

Для Swift:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()  // it just 1 line, awesome!
}

Ответ 4

Используя ссылку от Daniel, я сделал расширение, чтобы сделать его более удобным:

//UITableViewController+Ext.m
- (void)hideEmptySeparators
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];
    v.backgroundColor = [UIColor clearColor];
    [self.tableView setTableFooterView:v];
    [v release];
}

После некоторых тестов я узнал, что размер может быть 0, и он также работает. Поэтому в конце таблицы не добавляется какой-либо запас. Так что спасибо wkw за этот хак. Я решил опубликовать это здесь, так как мне не нравится перенаправление.

Ответ 5

Swift Версия

Самый простой способ - установить свойство tableFooterView:

override func viewDidLoad() {
    super.viewDidLoad()
    // This will remove extra separators from tableview
    self.tableView.tableFooterView = UIView(frame: CGRectZero)
}

Ответ 6

Если вы используете iOS 7 SDK, это очень просто.

Просто добавьте эту строку в свой метод viewDidLoad:

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

Ответ 7

Установка таблицы separatorStyle в UITableViewCellSeparatorStyleNone (в коде или в IB) должна сделать трюк.

Ответ 8

Для Swift:

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

Ответ 9

Я использую следующее:

UIView *view = [[UIView alloc] init];
myTableView.tableFooterView = view;
[view release];

Выполнение этого в viewDidLoad. Но вы можете установить его в любом месте.

Ответ 10

Для этой проблемы мне очень понравилось следующее:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {

CGRect frame = [self.view frame];
frame.size.height =  frame.size.height - (kTableRowHeight * numberOfRowsInTable);

UIView *footerView = [[UIView alloc] initWithFrame:frame];
return footerView; }

Где kTableRowHeight - это высота моих ячеек строк, а numberOfRowsInTable - количество строк, которые я имел в таблице.

Надеюсь, что это поможет,

Брентон.