2013-11-27 1 views
10

Я только что обнаружил поразительную проблему или противотоком intuituve поведение при использовании estimatedHeightForRowAtIndexPathоценкамHeightForRowAtIndexPath может фактически изменить окончательную «правильную» высоту строки?

(1) Моя таблица дико различной высоты строки. Конечные результаты могут варьироваться от 111 до 400.

(2) Я абсолютно точно вычислил каждую высоту строки. У меня есть в наличии массив, то есть кешированный.

{Обратите внимание, что это именно то, что, судя по всему, инженеры компании Apple рекомендуют ... Например, пункт 5 .. Using Auto Layout in UITableView for dynamic cell layouts & variable row heights}

(3) Когда heightForRowAtIndexPath просит высоты, я дать ему абсолютно правильное высота.

(4) В какой-то мере я строю ячейку, действительно, я строю ее точно на правильную высоту (как в (2) и (3)).

{Примечание. - это, конечно, IOS, что в конце концов размеры в высоту ячейки, а не «я»}

ЭТО ВСЕ РАБОТАЕТ ОТЛИЧНО.

т. Е. Каждая ячейка построена iOS точно на высоте, указанной в heightForRowAtIndexPath.

Теперь я добавить код ...

-(CGFloat)tableView:(UITableView *)tableView 
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 120; 
} 

В самом деле, СТОЛ БОЛЬШЕ РАБОТЫ .................. THE ROW ВЫСОТЫ СТАТЬ СЛУЧАЙНЫМИ !!!

ЛЮБОЕ ВИДЕТЬ ЭТО НЕПРЕРЫВНОЕ ПОВЕДЕНИЕ?

Я сделал различные тесты, чтобы попытаться определить взаимосвязь того, что, по-вашему, оценилHeightForRowAtIndexPath. Сначала я подумал, что это может обеспечить нижнюю границу высоты. Итак, 150 ... даже мои меньшие ячейки будут неправильно иметь высоту 150. Но это не тот случай.

Я думаю, что МОЖЕТ делать что-то вроде этого: скажем, ваше оценочное значениеHeightForRowAtIndexPath равно 150. Иногда оно использует 150 для строк, которые (на самом деле() оказываются такими или меньше, но иногда это происходит для реального размера от heightForRowAtIndexPath.

С другой стороны, если вы указали значение для оценочногоHeightForRowAtIndexPath, которое меньше, чем когда-либо существовало (скажем, 100 в моем примере), оно в значительной степени «совершенно не работает», вы просто получаете то, что может только кажутся случайными высотами на ячейках.

очень высокие ячейки, похоже, работают правильно, возможно, что-то вроде «если высота от высотыForRowAtIndexPath удваивает оценку ated, то он использует реальную высоту «

Чтобы быть ясным, кажется, что он никогда не делает ячейку слишком маленькой, но она часто делает их слишком большими.

Чтобы быть ясным, я не, используя автозапуск, это тип ячейки, которую вы только что должны построить. (Боюсь, я понятия не имею, как это происходит с автозапуском.) Это только Xcode5/iOS7 +.

+1

Возможно, максимальная высота может быть оценена? 400 в вашем случае. Я считаю, что делегат tableview нашел бы максимально возможный размер таблицы более полезным, чем минимальное или случайное значение между этими двумя. – KIDdAe

+0

Не работает! Когда я использую большое значение (скажем 400), одним словом, он «перепутал больше строк». Точно так же, если я использую небольшое значение (скажем, 50), оно «испортит больше строк». Для меня совершенно таинственный. – Fattie

+0

На самом деле это может быть, если вы установите смехотворно большое значение (2000), iOS просто «полностью проигнорирует» оценочное значение, а затем каждая строка является точной правильной высотой, как указано в heightForRowAtIndexPath ... Однако я не уверен. Удивительный и увлекательный вопрос !!! – Fattie

ответ

18

Обновлено Ответ

После дальнейших исследований, оказывается, "он просто требует Auto Layout" неверна. Это был мой образец кода, который требовал Автомакет. Я сделал небольшую модификацию в DynamicHeightCell, и теперь она работает с автоматической компоновкой или без нее.

Оригинал ответа

Это просто требует Auto Layout. Не удивительно, правда, но должно быть абсолютно документировано.

Вот рабочий проект, демонстрирующий tableView:estimatedHeightForRowAtIndexPath:, корректно работающий с автоматической компоновкой. Если вы отключите автоматическую компоновку в раскадровке, она будет вести себя так, как вы описали.

Estimated Row Height Demo

+0

No problemo Joe. Благодаря! –

+0

Ugh. @JoeBlow. Мне придется опровергнуть мой собственный небрежный ответ. См. Обновление. Пожалуйста, верните очки. Должен быть некоторый побочный эффект «оцененногоHeightForRowAtIndexPath», который нарушает вашу реализацию. Мне интересно, если это проблема повторного использования. Правильно ли отображаются начальные экранные ячейки, а затем вы видите неправильное поведение при прокрутке? Можете ли вы разместить свой расчет высоты и код конфигурации ячейки? –

+0

«Я просто сделал 20 ячеек и использовал их». Это несколько необычно. Можем ли мы увидеть ваши «cellForRowAtIndexPath» и «heightForRowAtIndexPath»? –

1
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { } 

Этот метод делегата обычно используется, когда у вас есть многочисленные количества динамических ячеек, что обеспечивает грубую оценку клетки.

Для exmaple: Если у вас есть 100 ячеек с каждой высотой от 200 до 300 (например, 201, 207, 250, 299, 300 ...) можно оценить высоту ячейки около 250. т.е.

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
return 250; 
} 
  • Предоставление оценки высоты строк может улучшить работу пользователя при загрузке представления таблицы.
  • Если этот делегат не реализован, может быть дорого рассчитать все их высоты и, следовательно, привести к более длительному времени загрузки.
Смежные вопросы