Расстояние между ячейками в UITableView с помощью пользовательского UITableViewCell

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

как сейчас
how it is now

как это supossed быть
how it's supossed to be

EDIT:
вот как код сегодня

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[self.cards valueForKeyPath:@"cards"] count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    [ccTableView setBackgroundColor:[UIColor clearColor]];
    cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"];

    if(cell == nil){
      NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil];
      cell = [topLevelObjects objectAtIndex:0];
    }

    NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:indexPath.row];
    cell.descCardLabel.text = nmCard;

  return cell;
}

4 ответов


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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *CELL_ID2 = @"SOME_STUPID_ID2";
    // even rows will be invisible
    if (indexPath.row % 2 == 1)
    {
        UITableViewCell * cell2 = [tableView dequeueReusableCellWithIdentifier:CELL_ID2];

        if (cell2 == nil)
        {
            cell2 = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                          reuseIdentifier:CELL_ID2];
            [cell2.contentView setAlpha:0];
            [cell2 setUserInteractionEnabled:NO]; // prevent selection and other stuff
        }
        return cell2;
    }

    [ccTableView setBackgroundColor:[UIColor clearColor]];
    cardsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardsCell"];

    if(cell == nil){
      NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"cardsCell" owner:self options:nil];
      cell = [topLevelObjects objectAtIndex:0];
    }

     // Use indexPath.row/2 instead of indexPath.row for the visible section to get the correct datasource index (number of rows is increased to add the invisible rows)
        NSString *nmCard = [[self.cards valueForKeyPath:@"cards.name"] objectAtIndex:(indexPath.row/2)];
        cell.descCardLabel.text = nmCard;

      return cell;
    }



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    // two times minus one (invisible at even rows => visibleCount == invisibleCount+1)
    return [[self.cards valueForKeyPath:@"cards"] count] * 2 - 1;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row % 2 == 1)
        return 40;
    return 162;
}

вам также нужно будет пересчитать indexPath.строку :didSelectRowAtIndexPath: и другие методы, где он используется.


на самом деле это довольно простое решение, которое я нашел, если вы используете пользовательские классы uitableviewcell.

в классе ячеек добавьте этот код:

- (void)setFrame:(CGRect)frame {
    frame.origin.y += 4;
    frame.size.height -= 2 * 4;
    [super setFrame:frame];
}

Это даст вам буфер 4pt в пределах высоты ячейки, которую вы помещаете в класс uitablview, в который вызываете эту ячейку. Очевидно, теперь вам нужно компенсировать это меньшее пространство в ячейке при вставке меток и изображений, но это работает. Вы также можете сделать то же самое на оси x, чтобы сделать ширину клетки поменьше. Я сделал это в своем приложении, чтобы показать фоновые изображения за моими ячейками.


хотя @A-Live технически корректен, чтобы предотвратить другие проблемы, например: вы забыли поставить indexPath.row / 2 где-то вы можете сделать следующее (которое не включает в себя программирование):

скажем, например, ваша высота UITableViewCell обычно составляет 90 точек, и вы хотите 10-точечный интервал между каждой ячейкой. Сделайте свой UITableViewCell на 100 пунктов выше и просто сделайте нижние 10 пунктов UITableViewCell пустым (без каких-либо объектов). Затем нажмите UITableViewCell в построитель интерфейса и установите backgroundColor в любой цвет области интервала, который вы хотите.

вуаля! Вы получили интервал между каждой ячейкой с небольшой работой, которая намного проще, чем программирование /2 везде!


Если вы ищете решение в Swift, этот ответ из reddit отлично сработало для меня.

class CustomTableViewCell: UITableViewCell {
override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        var frame =  newFrame
        frame.origin.y += 4
        frame.size.height -= 2 * 4
        super.frame = frame
    }
}
}