Как изменить внешний вид «пустых» ячеек в обычном 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)


arrow_upward
21
arrow_downward

Хотя это не совсем то, что вы ищете, вы также можете изменить его, чтобы просто отображать пустую область (вместо пустых ячеек), установив представление нижнего колонтитула в таблице. 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

arrow_upward
8
arrow_downward

На основе ответа 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

arrow_upward
5
arrow_downward

Я установил подкласс 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

arrow_upward
3
arrow_downward

Из 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

arrow_upward
1
arrow_downward

Если вы просто хотите изменить высоту «пустых ячеек», когда в вашем 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

arrow_upward
0
arrow_downward

Возможно, вам придется создать собственный подкласс 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

arrow_upward
0
arrow_downward

Я считаю, что подход с использованием метода 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

arrow_upward
0
arrow_downward

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

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