Как изменить внешний вид «пустых» ячеек в обычном UITableView?

Если у вас простой (не сгруппированный) UITableView с одной строкой, остальная часть экрана заполняется пустыми или пустыми ячейками. Как изменить внешний вид этих пустых ячеек? Во-первых, я думал, что они будут иметь вид ячейки, используемой в табличном представлении, но похоже, что это не так.

Люди из Cultured Code (Things) хорошо поработали, изменив эти клетки, но я не могу сразу придумать способ изменить их внешний вид.

Какие-нибудь советы?


person Bart Jacobs    schedule 20.06.2009    source источник
comment
Bump есть решение, которое работает? Пожалуйста, поделитесь здесь. Спасибо   -  person lostInTransit    schedule 22.06.2009
comment
Что я сделал до сих пор, так это добавил «невидимую» ячейку в конце представления таблицы с представлением изображения, которое отображает тень конца представления таблицы. Я установил для стиля разделителя значение «Нет». Это создает аналогичный эффект, но мне придется немного подправить его, чтобы он остался доволен.   -  person Bart Jacobs    schedule 22.06.2009


Ответы (8)


Хотя это не совсем то, что вы ищете, вы также можете изменить его, чтобы просто отображать пустую область (вместо пустых ячеек), установив представление нижнего колонтитула в таблице. UIView высоты 0 сделает свое дело.

person dmercredi    schedule 22.06.2009
comment
С вашей помощью я разобрался и это довольно просто. Добавьте желаемый UIImageView в нижний колонтитул UITableView (как вы предложили), но для правильного поведения табличного представления вам необходимо увеличить его высоту с высотой UIImageView. Таким образом, табличное представление будет вести себя как обычное табличное представление, но вы получите хороший эффект, который я искал. Обязательно удалите разделители ячеек в табличном представлении. - person Bart Jacobs; 24.06.2009
comment
У вас есть какой-нибудь код, который работает? У меня проблемы с воспроизведением того, что здесь описано - person Ben Clayton; 19.11.2012
comment
Вот что у меня сработало. В iOS 6.1 не похоже, что мне нужно увеличивать высоту представления: myTableView.tableFooterView = [[[UIView alloc] initWithFrame: CGRectZero] autorelease]; - person Josh Justice; 27.01.2013
comment
iOS 7/8 сейчас, и я не могу понять, как работает вид с нулевой высотой. Для меня это просто не отображается. ОБНОВЛЕНИЕ: На самом деле это работает. Если вы добавите представление с нулевой высотой, табличное представление не будет отображать пустую ячейку, а будет только пробел. Что мне нужно, так это что-то вложить в это представление. К сожалению, это не работает. - person wrtsprt; 29.07.2015

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

Создайте подкласс UIView - в этом примере я назвал его CustomTiledView - и добавьте в класс следующий код:

- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM (context, 1, -1); 
CGContextDrawTiledImage(context, 
                        CGRectMake(0, 0, rect.size.width, image.size.height), 
                        [image CGImage]); 
}

Добавьте следующий код в свой tableviewcontroller:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForFooterInSection:(NSInteger)section {
    // this can be any size, but it should be 1) multiple of the 
    // background image height so the last empty cell drawn
    // is not cut off, 2) tall enough that footer cells
    // cover the entire tableview height when the tableview
    // is empty, 3) tall enough that pulling up on an empty
    // tableview does not reveal the background.
        return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells
}

- (UIView *)tableView:(UITableView *)tableView 
            viewForFooterInSection:(NSInteger)section {
    CustomTiledView *footerView = [[CustomTiledView alloc] init];
    return [footerView autorelease];
}

Наконец, вам нужно установить нижнюю вставку содержимого вашего tableview на отрицательное значение, возвращаемое из -tableView:heightForFooterInsection:. В этом примере это будет -1*BACKGROUND_IMAGE_HEIGHT*9. Вы можете установить нижнюю вставку содержимого либо из Инспектора размера Интерфейса Builder, либо путем установки свойства self.tableView.contentInset из tableviewcontroller.

Ваше здоровье!

person memmons    schedule 28.03.2011

Я установил подкласс UIView высотой ~ 300 пикселей для своих представлений заголовка и нижнего колонтитула tableView, настроив вставки tableView, чтобы они компенсировали эти представления (установите верхние и нижние вставки на -300 пикселей).

Мой подкласс UIView реализует метод drawRect, в котором я использую CGContextDrawTiledImage() для многократного рисования пустого UITableViewCell:

- (void)drawRect:(CGRect)rect {

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0);
    emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero];
    [emptyCell drawRect:CGRectMake(0, 0, 300, 46)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    [emptyCell release];
    UIGraphicsEndImageContext();

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down
    CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]);
}

В моем случае мои ячейки tableview имеют высоту 46 пикселей, поэтому, если я хочу, чтобы подкласс UIView содержал 8 из этих пустых ячеек, мне нужно сделать его высотой 368 пикселей.

person samvermette    schedule 04.11.2010
comment
Мне нравится это решение, но в него можно внести некоторые изменения. Во-первых, я считаю, что выделение tableviewcell только для того, чтобы отрисовать ее, - это довольно неуклюжее. Идея, лежащая в основе этого, довольно гениальна - пустые ячейки автоматически отражают любые изменения, которые вы вносите в пользовательский дизайн tableviewcell. Однако я должен был представить, что дизайн будет меняться не очень часто, поэтому, вероятно, нет хорошего варианта использования этого универсального подхода. Скорее, я бы просто создал изображение из того, как выглядит ячейка, и использовал бы его. - person memmons; 28.03.2011
comment
Кроме того, я не поклонник магических чисел в коде. Я понимаю, почему вы вынуждены использовать их здесь - вам нужно знать контекстный фрейм перед загрузкой пустой ячейки - но на самом деле вы должны рисовать до заданного прямоугольного размера. - person memmons; 28.03.2011
comment
Имея в виду вышеизложенное, я добавил ответ, основанный на вашем коде, но который захватывает фоновое изображение напрямую, а не использует фактический tableViewCell. Однако я дал и этот ответ +1, так как считаю это интересным и жизнеспособным подходом. - person memmons; 28.03.2011

Из http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html Простой способ - определить, что в таблице нет разделительных линий ячеек:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

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

Другой способ - определить пустой tableFooterView UITableView:

UIView *footer =
    [[UIView alloc] initWithFrame:CGRectZero];
self.myTable.tableFooterView = footer;
[footer release];
person sonofatrus    schedule 23.04.2012

Если вы просто хотите изменить высоту «пустых ячеек», когда в вашем TableView вообще нет ячеек: вам необходимо установить свойство rowHeight вашего UITableView (реализация tableView:heightForRowAtIndexPath: не влияет на пустые TableViews). Если в вашем TableView есть ячейки и вы реализовали tableView:heightForRowAtIndexPath:, тогда для пустых ячеек будет использоваться последняя высота строки.

person Julian D.    schedule 08.12.2011
comment
Это изменит высоту всех ячеек, независимо от того, что делает tableView:heightForRowAtIndexPath:. - person executor21; 15.03.2012
comment
@ Executionor21: неверно, tableView:heightForRowAtIndexPath: всегда переопределяет значение, которое вы установили с помощью свойства rowHeight, но оно будет применяться только в том случае, если есть хотя бы одна ячейка. - person Julian D.; 15.03.2012

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

- (void)drawRect:(CGRect)rect {
  [super drawRect: rect];

  // draw your background here if the rect intersects with the background area
}
person Daniel    schedule 20.06.2009

Я считаю, что подход с использованием метода UITableView tableView:viewForFooterInSection: не будет работать в случае, когда таблица пуста, то есть без ячеек. В этом случае вы можете использовать предложенную технику Answerbot, которая может быть перепрофилирована, чтобы явно вставить созданный UIView в нижний колонтитул таблицы, вроде следующего:

    CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height);
    CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease];
    table.tableFooterView = footerView;
person MoFlo    schedule 28.10.2011

Для быстрого 4.0:

self.tableView.tableFooterView = UIView(frame: CGRect.zero)
person ArtZen    schedule 06.08.2018