Ответ 1
Хотя это не совсем то, что вы ищете, вы также можете изменить его, чтобы просто отобразить пустую область (вместо пустых ячеек), установив нижний колонтитул в таблице. UIView высоты 0 сделает трюк.
Если у вас есть простой (не сгруппированный) UITableView с одной строкой, остальная часть экрана заполняется пустым или пустым ячейками. Как вы меняете внешний вид этих пустых ячеек? Во-первых, я думал, что они будут иметь вид ячейки, используемой в представлении таблицы, но, похоже, они этого не делают.
Люди из Cultured Code (Things) проделали хорошую работу по изменению этих ячеек, но я не могу сразу придумать способ изменить их внешний вид.
Любые советы?
Хотя это не совсем то, что вы ищете, вы также можете изменить его, чтобы просто отобразить пустую область (вместо пустых ячеек), установив нижний колонтитул в таблице. UIView высоты 0 сделает трюк.
На основе ответа 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.
Ура!
Я установил подкласс класса 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 высоким.
От 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];
Если вы просто хотите изменить высоту "пустых ячеек", когда в вашем TableView нет никаких ячеек: вам нужно установить свойство rowHeight
вашего UITableView (реализация tableView:heightForRowAtIndexPath:
не влияет на пустой TableViews). Если в вашем TableView есть ячейки, и вы внедрили tableView:heightForRowAtIndexPath:
, тогда последняя длина строки будет использоваться для пустых ячеек.
Вам, вероятно, придется создать собственный подкласс UITableView, который заполняет фон появлением пустых ячеек.
- (void)drawRect:(CGRect)rect {
[super drawRect: rect];
// draw your background here if the rect intersects with the background area
}
Я считаю, что подход использования метода 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;