Как я могу изменить внешний вид «пустых» ячеек в обычном UITableView? - PullRequest
22 голосов
/ 21 июня 2009

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

Люди из Культурного Кодекса (Вещи) проделали хорошую работу по модификации этих ячеек, но я не могу сразу придумать, как изменить их внешний вид.

Любые советы?

Ответы [ 8 ]

21 голосов
/ 22 июня 2009

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

8 голосов
/ 28 марта 2011

Основано на ответе 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:heightForFooterInsection: В этом примере это будет -1*BACKGROUND_IMAGE_HEIGHT*9. Вы можете установить нижнюю вставку содержимого либо из Инспектора размеров Интерфейсного Разработчика, либо установив свойство self.tableView.contentInset из tableviewcontroller.

ура!

5 голосов
/ 04 ноября 2010

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

Мой подкласс 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]);
}

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

3 голосов
/ 23 апреля 2012

С 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];
1 голос
/ 08 декабря 2011

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

0 голосов
/ 06 августа 2018

Для быстрой 4,0 :

self.tableView.tableFooterView = UIView(frame: CGRect.zero)
0 голосов
/ 29 октября 2011

Я считаю, что подход с использованием метода 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;
0 голосов
/ 21 июня 2009

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

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

  // draw your background here if the rect intersects with the background area
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...