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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

На основе ответа 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. Вы можете установить нижнюю вставку содержимого либо из Инспектора размеров Interface Builder, либо путем установки свойства self.tableView.contentInset из контроллера tableview.

Ура!

Ответ 3

Я установил подкласс класса UIView размером ~ 300 пикселей в верхний и нижний колонтитулы 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]);
}

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

Ответ 4

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

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

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

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

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

Ответ 5

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

Ответ 6

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

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

  // draw your background here if the rect intersects with the background area
}

Ответ 7

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