Разделители UITableView размещены неправильно

Я работаю с динамическим UITable с ячейками прототипа, который создается в раскадровке в iOS 5. В этой таблице высота ячеек зависит от содержимого ячейки и оценивается программно в heightForRowAtIndexPath. Моя проблема заключается в том, что в отображаемой таблице строки-разделители ячеек расположены в неправильных местах. Вот несколько фактов о моей программе:

  • Содержимое ячеек и выделение отображаются в нужных местах
  • В cellForRowAtIndexPath я использую dequeueReusableCellWithIdentifier для создания новых ячеек
  • heightForRowAtIndexPath возвращает правильные значения для всех ячеек

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

Очень ценю вашу помощь.

Спасибо,

Анис


person Anis    schedule 05.07.2013    source источник
comment
Привет Тимоти! Надеюсь, вы получили мой ответ на свой пост. Видимо, это было слишком долго для комментария, поэтому вместо этого я разместил его как ответ. Не слишком уверен, как эти вещи работают в stackoverflow. Спасибо, Анис   -  person Anis    schedule 10.07.2013
comment
Нет, я не видел твоего поста. К сожалению, я не вижу никаких красных флажков в вашем коде. Что я, вероятно, сделал бы здесь, так это поместил бы точку останова в willDisplayCellAtIndexPath, а затем сделал бы po [cell recursiveDescription], чтобы распечатать иерархию представления ячейки. Изучите эту иерархию, чтобы увидеть, нет ли неожиданно перекрывающихся ячеек. Это может дать подсказку.   -  person Timothy Moose    schedule 10.07.2013
comment
Если вы все еще застряли, вы можете попробовать опубликовать пример проекта, чтобы мы могли его посмотреть. Или вы можете взглянуть на Пример проекта Dynamic Height в моей библиотеке TLIndexPathTools. Вы можете попробовать изменить пример проекта с вашими данными, чтобы увидеть, работает ли он.   -  person Timothy Moose    schedule 10.07.2013
comment
Спасибо, Тимоти, я проверил иерархию представления ячеек, и все выглядит нормально (с точки зрения расположения фреймов для ячеек и содержимого ячеек).   -  person Anis    schedule 17.07.2013
comment
Я думаю, что моя высота ячейки в порядке. WillDisplayAtCellIndex возвращает правильную высоту, а также, когда я нажимаю на ячейку, она правильно выделяется. Однако разделители не расположены на правильной высоте. К сожалению, проект, над которым я работаю, довольно большой со многими зависимостями, поэтому я не думаю, что смогу легко вырезать соответствующие разделы для загрузки. Я попытаюсь использовать ваш пример кода, чтобы увидеть, работает ли он. Спасибо.   -  person Anis    schedule 17.07.2013
comment
Просто выбрасываю сюда идеи. Вы также можете проверить слои, чтобы убедиться, что что-то не так. Недавно я ответил на этот вопрос о сгруппированной ячейке таблицы backgroundColor, и оказалось, решение требовало установки слоя ячейки backgroundColor.   -  person Timothy Moose    schedule 17.07.2013


Ответы (1)


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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *currentCell = nil;

    if([indexPath section] == 0 && [indexPath row]== 0)
    {
        currentCell = [issueDetailTable dequeueReusableCellWithIdentifier:@"DetailFieldCell"];

        NSString *summaryString;

        /* Here I call a method to figure out the value for summaryString */

        /* Here I call a method to figure out the frame for summaryLabel */

        summaryLabel = (UILabel *)[currentCell viewWithTag:1];
        [summaryLabel setFrame:summaryRect];
        [summaryLabel setText:summaryString];
    }
    return currentCell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    CGFloat height;

    if([indexPath section] == 0 && [indexPath row]== 0)
    {
        NSString *summaryString;

        /* Here I call the same method to figure out the value for summaryString */

        /* Here I call the same method to figure out the frame for summaryLabel */

        /* height = height of the summary label */
    }

    return height;
}

Что касается раскадровки, я использую ячейки-прототипы для своей таблицы; Моя таблица автоматически изменяет размеры и обрезает подвиды и очищает графический контекст; Мои ячейки очищают графический контекст.

И я собирался опубликовать снимок экрана с моей таблицей, но, видимо, моих очков репутации Stackoverflow недостаточно! :|

Еще раз спасибо, что помогли мне разобраться в этом.

С уважением, Анис

person Anis    schedule 08.07.2013
comment
В приведенном выше коде вы возвращаете неопределенное значение для height в heightForRowAtIndexPath для всех строк, кроме (0, 0). Может быть, это как-то связано с этим. - person Timothy Moose; 13.07.2013
comment
На самом деле я пытался упростить свой код. В моем коде я возвращаю значения для всех строк. - person Anis; 17.07.2013