Вопрос по objective-c, iphone – Расстояние между ячейками в UITableView с помощью пользовательского UITableViewCell

8

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

как сейчас

как это должно быть

РЕДАКТИРОВАТЬ
Таков сегодня код

- (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;
}
Ответ за Свифт (Одна секция на метод элемента массива) Suragch
@ obuseme Кроме того, в моей ячейке есть фоновое изображение с высотой 35, где находится метка. Если я увеличу высоту строки, макет будет таким, каким я хочу, но выбор касания будет работать под изображением, на интервале, и я не хочу случайного выбора неправильного ряда. gmogames
Почему ты не хочешь поднять высоту строки? Andy Obusek
@ obuseme в самом простом случае - это одно xib и три состояния строки (среднее, верхнее, нижнее), код будет довольно запутан. A-Live

Ваш Ответ

4   ответа
7

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

- (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.row для:didSelectRowAtIndexPath: и другие методы, где он используется.

любой шанс для примера кода о том, как это сделать? Я добавил свой текущий код к вопросу. Благодарность gmogames
@ Guilherme Mogames смотрите обновление A-Live
На самом деле, этот единственный код сделал все четные строки пустыми. Например, первая строка (ячейка 1) возвращает 0, поэтому вместо возврата ячейки с текстом она возвращает пустую ячейку 2. поэтому я получаю 2 элемента в таблице, но 1-й пусто gmogames
@ Гильерме правильно, исправил это с помощьюindexPath.row % 2 == 1, чтобы четные строки были невидимыми, я имел в виду 2,4,6, ... считая от 1. A-Live
это сработало! единственное, что я добавил в код, было[cell2 setUserInteractionEnabled:NO] поэтому касание отключено для этих ячеек. Большое спасибо за помощь gmogames
37

если вы используете пользовательские классы uitableviewcell.

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

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

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

Круто ! это работает отлично, чем я ожидал! serhat sezer
Круто! Голосуй за это решение. lee
Спасибо, это то, что я ищу Harshad
работает; но авто макет поврежден; я работаю над расширяемой клеткой; при нажатии на ячейку, чтобы развернуть расширенную ячейку, не корректируя весь текст; Можете ли вы совет Sonic
4

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

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

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

как мне сделать 10-ю нижнюю ни с чем? Я просто установил фон ячейки на белы Dejell
0

ответ от 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
    }
}
}

Похожие вопросы