Як видалити останню межу останньої комірки в UITableView?


76

У своєму додатку я використовую UITableView Моя проблема полягає в тому, що я хочу видалити останню межу останньої комірки в UITableView.

Будь ласка, перевірте наступне зображення:

введіть тут опис зображення


Змінити роздільник
Вставити

Відповіді:


25

Оновлено 14.09.15. Моя оригінальна відповідь застаріла, але вона все ще є універсальним рішенням для всіх версій iOS:

Ви можете приховати tableViewстандартний роздільник та додати свій власний рядок у верхній частині кожної комірки. Найпростіший спосіб додати власний роздільник - це додати простий UIViewвисотою 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];

На сьогоднішній день я підписуюсь на інший спосіб приховування зайвих роздільників під клітинками (працює для iOS 6.1+):

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

6
Метод CGRectZero у мене не спрацював. Однак інша відповідь нижче, яка встановлює фрейм на CGRectMake (0, 0, self.tableView.frame.size.width, 1), справді спрацювала.
Еквадор

Геніальна відповідь! врятував мій день.
Rohit Mandiwal

1
Коментар Еквадору є правильним. Відповідь не працює на iOS 12 і не повинен бути позначений як правильний, оскільки просто видаляє роздільники з порожніх комірок.
fl034

135

Найкраще рішення - додати нижній колонтитул. Наступний код ідеально приховує рядок останньої комірки:

Завдання-C

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];

Свіфт 4.0

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

12
Працює лише тоді, коли у вас є один розділ
GoodSp33d

@ GoodSp33d У мене є кілька розділів, і це працює, роблячи це таким чином. if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1) { self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)]; } У CellForRowAtIndexPathджерелі даних
Джош Вальдівієсо,

Мій поганий коментар рано. Додаючи лише цей рядок, я встановлюю висоту за замовчуванням до 44 пікселів, я думаю, тому разом із цим рядком коду я повинен передаватись 1.0fяк висота нижнього колонтитула в -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)sectionделегаті. Зараз це працює як шарм. Проголосовано
GoodSp33d

42

У iOS 7 є простіше рішення. Припустимо, клітина - це ваша остання клітина:

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

5
Це приховує цілий вміст моїх клітин. Етикетка стає невидимою.
karim

3
не працює, він просто зміщує ярлик вправо.
SamChen

Мені чудово підходить для iOS 7 із непрокручувальною таблицею з фіксованою кількістю комірок, коли я застосовую це до нижньої комірки.
clearlight

Не можна використовувати зі "стандартними" комірками, оскільки вставка визначає місце розташування мітки. Може використовуватися з клітинними клітинами.
Метт

13

Це працює для мене в iOS 7 і 8:

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));

ПРИМІТКА: будьте обережні при використанні, tableView.boundsоскільки інколи воно повідомляє про неправильне значення, залежно від того, коли ви його викликаєте. Див. Звітування про неправильні межі в альбомному режимі


Також ідеально працює в iOS8. Дякую
Тім

1
Я використав це, щоб уникнути дивної поведінки на 5,5-дюймовому екрані:cell!.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(self.tableView.bounds)-self.view.layoutMargins.left)
Камілло

Коли орієнтація спочатку в портреті, потім у
альбомі

10

Додайте цей рядок коду в viewDidLoad().

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))

Це гарантує, що останній роздільник буде замінено, а замінений (невидимий) вигляд нижнього колонтитула не займе зайвої висоти. Оскільки шириною подання нижнього колонтитула буде керувати UITableView, тому ви можете встановити для нього значення 0.


Єдине рішення, яке працювало для мене, - це .zeroодин роздільник внизу таблиці.
Ідо

@Ido привіт, лише щоб повідомити, що II відкотив вашу редагувальну версію, тому що я не вважаю CGRectрозширення, яке ви додали, чудовою практикою. Якщо вам не подобаються ці громіздкі 0у зразку коду, ви можете написати щось на зразок цього:var frame = CGRect.zero \n frame.size.height = 0.001
Джонні

Чи можу я запитати, чому це не є гарною практикою? Це дозволяє вам використовувати той самий спосіб, з яким ви можете використовувати .zero, але використовуйте фактичний нуль (0,001), який робить те, що вам потрібно.
Ідо

Тому що він недостатньо гнучкий (а якщо одного дня ви захочете кадр із шириною 0,001?), А назва властивості CGRect.myZeroне дає великого сенсу того, що він може зробити.
Джонні,

Ви можете назвати це, almostZeroякщо саме це робить його не гнучким. Ви можете додати коментар над цим, static let ...щоб описати його (за допомогою 3 /, так що ви зможете побачити його через інтерфейс автозаповнення xCode).
Ідо

5

Рішення на базі розширення для Swift 4, тестоване на iOS 12

Я помітив, що встановлення порожнього подання height = 1також видаляє роздільник останньої видимої комірки, однак установка height = 0просто видаляє роздільник порожніх комірок

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

    func removeSeparatorsOfEmptyCellsAndLastCell() {
        tableFooterView = UIView(frame: CGRect(origin: .zero, size: CGSize(width: 0, height: 1)))
    }
}

1
Дякую. Виявляється, підійде будь-яка позитивна, ненульова висота. напр. 0,1 бала.
Womble


3

У Swift просто:

tableView.tableFooterView = UIView()

Ви використовуєте Swift 3?
DungeonDev

Це спрацювало для мене. Примітка. Я використовував підкласUITableViewController
Alex Chase

iOS 13.4.1 не працює, але `` tableView.tableFooterView = UIView (кадр: CGRect (x: 0, y: 0, ширина: CGFloat.leastNonzeroMagnitude, висота: .leastNonzeroMagnitude)) ``
leo.tan

2

Ось засіб, яким я зараз користуюся. це може бути не найкращий підхід, але він працює.

Видаліть SeparatorColor та setSeparatorStyle, щоб зробити власний роздільник

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.tableView setSeparatorColor:[UIColor clearColor]];
}

Додайте власний роздільник до кожної комірки з фоном табличного перегляду

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    ...

    UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
    separatorLineView.backgroundColor = self.tableView.backgroundColor;
    [cell.contentView addSubview:separatorLineView];

    return cell;
}

1
Це не буде працювати з клітинками зі спеціальною висотою - у той момент, коли ви отримуєте висоту комірки, комірка не була повністю викладена. Крім того, ви не повинні використовувати жорстко закодовані значення, такі як 320 - як це виглядає на iPhone 6?
Зорайр,

1

Для iOS 7 і новіших версій

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        BOOL bIsLastRow = NO;

        //Add logic to check last row for your data source
        NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
        if([_arrDataSource lastObject] == dict)
        {
           bIsLastRow = YES;
        }

        //Set last row separate inset left value large, so it will go outside of view
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) 
        {
            [cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
        }
    }

1

Свіфт 4.2

Щоб отримати роздільник, який рухається зліва направо у вашій останній комірці, додайте це у свою UITableViewDataSource's tableView(_:cellForRowAt:)реалізацію:

if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
        cell.separatorInset = .zero
}

Якщо вам не потрібен роздільник для однієї конкретної комірки, спробуйте намалювати власний роздільник і встановити tableView.separatorStyle = .none.


1
_tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

3
Привіт та ласкаво просимо до stackoverflow та дякуємо за відповідь. Незважаючи на те, що цей код може відповісти на запитання, чи можете ви додати пояснення щодо того, яку проблему вирішено та як її вирішено? Це допоможе майбутнім читачам краще зрозуміти вашу відповідь і навчитися з неї.
Плутіан

1

Нижче код допомагає мені видалити роздільник з останнього рядка в UITableView.

Свіфт 3.0

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) {
        cell.separatorInset.right = cell.bounds.size.width
    }
}

0

Знайдіть останній індекс клітинки в cellForRowделегатові та поставте рядок коду знизу:

cell.separatorInset = UIEdgeInsetsMake(
    0.f,
    40.0f,
    0.f,
    self.view.frame.size.width-40.0f
);

0

Інший варіант - підкласифікація UITableView:

@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
    if (_hideLastSeparator == hideLastSeparator) {
        return;
    }
    _hideLastSeparator = hideLastSeparator;
    if (_hideLastSeparator) {
        _hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
        _hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
        _hideLastSeparatorView.backgroundColor = self.backgroundColor;
        [self addSubview:_hideLastSeparatorView];
        [self hideSeparator];
    }
    else {
        [_hideLastSeparatorView removeFromSuperview];
        _hideLastSeparatorView = nil;
    }
}
-(void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    if (_hideLastSeparator) {
        [self hideSeparator];
    }
}
-(void)hideSeparator {
    CGRect frame = _hideLastSeparatorView.frame;
    frame.origin.y = self.contentSize.height - frame.size.height;
    _hideLastSeparatorView.frame = frame;
}

.H повинен містити лише декларації про властивості для hideLastSeparatorта hideLastSeparatorView.
Якщо ви хочете приховати роздільник, використовуйте новий клас і набір myTableView.hideLastSeparator = YES.
Це працює шляхом перешкоджання останньому роздільнику шляхом додавання нового вигляду над ним.

На мій погляд, це дещо простіше у використанні (ніж використання користувальницького роздільника або встановлення останнього роздільника tableFooterViewВставлення останньої комірки) і дозволяє уникнути деяких дивних анімацій, які іноді викликає метод встановлення a (наприклад, під час вставки / видалення рядка або іншої таблиці анімація).


0

Якщо ви використовуєте спеціальні роздільники, UITableViewCellнайкращим рішенням є:

  1. Реалізуйте у своїй користувацькій функції комірки, яка приховує separatorView
class YourCell: UITableViewCell {
    // Your implementation goes here...
    // Separator view in cell
    @IBOutlet private weak var separatorView: UIView!

    // This function hides the separator view
    func hideSeparator() {
        separatorView.isHidden = true
    }
}
  1. При tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)обчисленні, якщо комірка остання і приховує свій роздільник
public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard let cell = cell as? YourCell else {
            return
    }
    // Here we're checking if your cell is the last one
    if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) - 1 {
        // if true -> then hide it
        cell.hideSeparator()
    }
}

-2

Розширюючи відповідь Тонні Сю, у мене є кілька розділів, і це, здається, працює для видалення останнього роздільника комірок

if(indexPath.row == [self.tableView numberOfRowsInSection:indexPath.section] - 1)
{
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];
}

У cellForRowAtIndexPathджерелі даних


1
Це залежить від якоїсь прихованої деталі реалізації - ви насправді не повинні цим займатися; tableFooterViewіснує для всієї таблиці, а не лише для останньої комірки. Загалом, хакерське рішення і може не завжди спрацювати.
Zorayr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.