Как удалить последнюю границу последней ячейки в UITableView?



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



пожалуйста, проверьте следующее изображение:



enter image description here

618   16  

16 ответов:

Обновление ПО 9/14/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];

лучшим решением является добавление нижнего колонтитула. Следующий код отлично скрывает строку последней ячейки:

С

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

Swift 4.0

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

в iOS 7 есть более простое решение. Предположим, что ячейка-это ваша последняя ячейка:

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

это работает для меня в iOS 7 и 8:

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

Примечание: будьте осторожны с использованием tableView.bounds как это иногда сообщает неправильное значение в зависимости от того, когда вы его вызываете. Смотрите сообщение о неправильных границах в ландшафтном режиме

нет, вы не можете этого сделать. Эти сепараторы довольно вырезать и сухой, стиль и цвет вот и все. Однако альтернативным решением может быть отключение всех разделителей вместе и установка фонового изображения с горизонтальной линией внизу для всех ячеек, кроме последней.

E. X:

    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    if (indexPath.row == [myArray count] - 1) {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
        [cell setBackgroundView:imageView];
    }

вот средство, которое я в настоящее время использую. возможно, это не лучший подход, но он работает.

удалите SeparatorColor и setSeparatorStyle, чтобы сделать пользовательский разделитель

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

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

добавить пользовательский разделитель в каждую ячейку с фоном tableview

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

моя более короткая версия:

self.tblView.tableFooterView = [UIView new];

для 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)];
        }
    }

ниже код помогает мне удалить разделитель из последней строки в UITableView.

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

добавьте эту строку кода в viewDidLoad().

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

Это убедитесь, что последний разделитель будет заменен и замененный (невидимый) вид нижнего колонтитула не будет занимать никакой дополнительной высоты. Поскольку ширина нижнего колонтитула будет управляться UITableView, Так что вы можете установить его в 0.

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

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

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

другой вариант-это подклассы 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;
}

The .h должен содержать только объявления свойств для hideLastSeparator и hideLastSeparatorView.
Если вы хотите скрыть разделитель, используйте новый класс и установите myTableView.hideLastSeparator = YES.
Способ, которым это работает, заключается в блокировании последнего разделителя путем добавления нового представления над ним.

это несколько проще в использовании на мой взгляд (чем использование пользовательского разделителя или установка последнего separatorInset последней ячейки) и позволяет избежать некоторых странные анимации, что метод установки tableFooterView иногда вызывает (например, во время вставки/удаления строк или других анимаций таблицы).

в Swift просто:

tableView.tableFooterView = UIView()

Swift 4.2

чтобы получить разделитель, который идет слева направо в вашей последней ячейке, добавьте это в свой UITableViewDataSource'stableView(_:cellForRowAt:) реализация:

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

Если вам не нужен разделитель для одной конкретной ячейки, подумайте о том, чтобы нарисовать свой собственный разделитель и установить tableView.separatorStyle = .none.

расширяя ответ Tonny Xu, у меня есть несколько разделов, и это, похоже, работает для удаления последнего разделителя ячеек

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 источник

Comments

    Ничего не найдено.