2012-05-25 3 views
8

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

как теперь
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; 
} 
+0

Почему вы не хотите поднимать высоту ряда? –

+0

@obuseme в самом простом случае есть один xib и три состояния строк (средний, верхний, нижний), код будет довольно запутанным. –

+0

@obuseme Кроме того, моя ячейка имеет фоновое изображение с 35 высотой, где находится метка. Если я подниму высоту строки, макет будет таким, как я хочу, но выбор выделения будет работать под изображением, на расстоянии, и я не хочу случайных выборов неправильной строки. – gmogames

ответ

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: и других способов, в которых она используется.

+0

любая возможность для примера кода о том, как это сделать? Я добавил свой текущий код к вопросу. Благодарю. – gmogames

+0

@Guilherme Mogames см. Обновление –

+1

Собственно, этот только код сделал все четные строки пустыми. Например, первая строка (ячейка 1) возвращает 0, поэтому вместо возврата ячейки с текстом она возвращает ячейку2 пустой. поэтому я получаю 2 элемента в таблице, но 1-й пуст. – gmogames

4

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

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

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

+0

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

36

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

В классе клеток, добавьте этот код:.

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

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

+0

Прохладный! он работает отлично, чем я ожидал! –

+0

Прохладный! Голосуйте за это решение. – lee

+0

Спасибо, это то, что я ищу :) – Harshad

0

Если вы ищете решение в 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 
    } 
} 
} 
Смежные вопросы