Подтвердить что ты не робот

UITableView: правильный способ отображения разделителя для последней ячейки

Вопрос в том, что самый лучший способ отображения разделителя в последней ячейке таблицы/раздела.

В основном это то, чем я занимаюсь.

enter image description here Это из приложения для родной музыки, что заставляет меня думать, что его можно достичь только с помощью UITableView, они не будут использовать какой-либо частный API для разделителей ячеек, правильно?

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

  • Когда ячейка выбрана/выделена разделителем и, разделитель предыдущей ячейки автоматически скрыт (см. второй снимок экрана с "Вы должны быть сумасшедшими" выбраны). А это то, что я хочу, чтобы UITableView обрабатывал вместо того, чтобы делать сам, если я использую однопиксельную линию (что особенно удобно, когда разделители ячеек не распространяют все путь к краю представления таблицы, разделители и выбранный фон ячейки не выглядят хорошо вместе).
  • Я бы хотел, чтобы мои ячейки были как можно более плоскими для прокрутки.

Также есть что-то в ссылке UITableView, которая заставляет меня думать, что есть простой способ получить то, что я хочу:

В iOS 7 и более поздних версиях разделители ячеек не распространяются полностью на край представления таблицы. Это свойство устанавливает стандартную вставку для всех ячейки в таблице, так же как rowHeight задает высоту по умолчанию для клетки. Он также используется для управления "дополнительными" разделителями, нарисованными на нижняя часть таблиц с обычным стилем.

Кто-нибудь знает, как именно использовать эти "дополнительные" разделители, рисуемые внизу таблиц обычного стиля? Потому что это именно то, что мне нужно. Я думал, что присваивание separatorInset UITableView, а не UITableViewCell выполнит трюк, но это не так, последняя ячейка все еще не имеет разделителя.

В данный момент я вижу только один вариант: иметь пользовательский раздел нижнего колонтитула для имитации разделителя для последней ячейки. И это плохо, особенно если вы хотите иметь фактический нижний колонтитул раздела, используя метод tableView:titleForFooterInSection:.

4b9b3361

Ответ 1

Это работало безупречно для меня, чтобы добавить разделитель в последнюю ячейку. получайте удовольствие!

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

Ответ 2

Я только что нашел что-то, что работает для меня. В нескольких словах: дать вашему UITableView табличное представление и установить его высоту кадра 0. Это делает фактическое отображение разделителя с правильными вставками.

Более подробно: если вы используете раскадровку, перетащите UIView в нижнюю часть вашего представления таблицы (в древовидном представлении слева), чтобы он отображался чуть ниже Table View Cell на том же иерархическом уровне. Это создает tableFooterView. Конечно, это можно сделать и программным способом.

Затем в вашей реализации UITableViewController:

UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];

Сообщите мне, если это сработает для вас! Он также может работать для первого разделителя, если вместо этого вы используете tableHeaderView, но я не пробовал его.

Ответ 3

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

in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;

Ответ 4

У меня была аналогичная проблема, и я нашел обходной путь. Apple скрывает последний разделитель uitableviewcell, а затем отображает его, если вы выберете ячейку или вызовите select и отмените выбор в этой ячейке.

Итак, я учил, что лучше всего в - (void)layoutSubviews. Вид разделителя называется _separatorView, и это частное свойство. Используя выделенные или выделенные ячейки, вы можете найти что-то вроде этого:

- (void)layoutSubviews
{
    // Call super so the OS can do it layout first
    [super layoutSubviews];

    // Get the separator view
    UIView *separatorView = [self valueForKey:@"_separatorView"];
    // Make the custom inset
    CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
    newFrame = CGRectInset(newFrame, 15.0, 0.0);
    [separatorView setFrame:newFrame];

    // Show or hide the bar based on cell state        
    if (!self.selected) {
        separatorView.hidden = NO;
    }
    if (self.isHighlighted) {
        separatorView.hidden = YES;
    }
}

Что-то вроде этого.

Ответ 5

Вы можете сделать что-то вроде этого, если вы не используете разделы:

- (void)viewDidLoad
{
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}

Если вы используете разделы, реализуете нижний колонтитул в каждом разделе как один вид точки в методах

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

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}

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

Ответ 6

В iOS 8, если у вас есть UITableView в обычном стиле и добавлен нижний колонтитул, последний разделитель исчез. Однако вы можете легко воссоздать его, добавив пользовательский вид разделителя в нижний колонтитул.

Этот пример точно имитирует стиль сепаратора Today

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

        //create footer view
        let result = UIView()
        result.frame.size.height = tableView.rowHeight

        //recreate last cell separator, which gets hidden by footer
        let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
        let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
        vibrancyEffectView.frame = sepFrame
        vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
        result.addSubview(vibrancyEffectView)
        return result
}

Ответ 7

Если вы добавите пустой нижний колонтитул, тогда tableview удалит все оставшиеся разделители строк (для несуществующих ячеек), но по-прежнему будет включать разделитель для последней ячейки:

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

Ответ 8

Работает в iOS 7.x и 8.x(помещает его в cellForRowAtIndexPath):

(PS замените "максимальные элементы вашего источника данных" на счетчик данных вашего массива)

 if (row == <max elements of your datasource>-1) {
     UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
     separatorLineView.tag = 666;
     separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
     UIView *separator = [cell.contentView viewWithTag:666];
     // case of orientation changed..
     if (separator.frame.size.width != cell.contentView.frame.size.width) {
        [[cell.contentView viewWithTag:666] removeFromSuperview];
        separator = nil;
     }
     if (separator==nil) [cell.contentView addSubview:separatorLineView];
 }

Ответ 9

Это определенно помогает. За работой. но установите разделитель "none" из инспектора атрибутов. Напишите следующий код в методе cellForRowAtIndexPath

if(indexPath.row==arrData.count-1){
 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,           
 cell.contentView.frame.size.height - 1.0,      
 cell.contentView.frame.size.width, 1)];

    lineView.backgroundColor = [UIColor blackColor];
    [cell.contentView addSubview:lineView];
}

Ответ 10

Следующий код работал у меня:

UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 0.35)];
footerView.backgroundColor = [UIColor whiteColor];
CGRect frame = footerView.frame;
frame.origin.x = 15;
frame.size.width = frame.size.width - 15;
UIView *blackView = [[UIView alloc] initWithFrame:frame];
[blackView setBackgroundColor:[UIColor blackColor]];
blackView.alpha = 0.25;
[footerView addSubview:blackView];
tableView.tableFooterView = footerView;

Надеюсь, что это сработает и для вас.