Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Bart JacobsОтветов: 8

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

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

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

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

iphonecocoa-touchuitableview

Ответы

Ответ 1 · рейтинг 21 · dmercredi

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

Ответ 2 · рейтинг 8 · memmons

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

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

Ответ 3 · рейтинг 5 · samvermette

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

Ответ 4 · рейтинг 3 · sonofatrus

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

Ответ 5 · рейтинг 1 · Julian D.

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

Ответ 6 · Daniel

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

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

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

Ответ 7 · MoFlo

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

Ответ 8 · ArtZen

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

self.tableView.tableFooterView = UIView(frame: CGRect.zero)

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы