2015-02-27 5 views
3

Это должно быть довольно прямо вперед, но, похоже, мне нужно выйти и спросить, если другие сталкивались с этим ...IOS 7+ UITableView с 3 различных прототипов клеток различной высоты

У меня есть проект на xcode 6, ориентированном на iOS 7+. Я использую раскадровку и autolayout. Я создал UIViewController, упал на UITableView, и на этом UITableView я упал на 3 разных прототипа, каждый с разной высотой. Каждая прото-ячейка имеет свой собственный класс UITableViewCell, связанный соответственно с UIElement.

Эти протоэлементы разработаны в графическом редакторе раскадровки, и каждый из них имеет фиксированную высоту. Никогда не будет расти в такой высоте: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

Проблема со всеми примерами, которые я продолжаю искать, заключается в том, что все они используют одну ячейку прототипа и изменяют высоту на основе содержимого (то есть используют UITextView и калибруют высота ячейки зависит от количества текста в представлении).

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

Я использую оператор switch в cellForRowAtindexPath, чтобы определить, какой класс UITableViewCell использовать на основе indexPath.row.

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

Все это отлично работает на iOS8. Однако на iOS7 все три мои камеры визуально заканчиваются друг на друга.

Для усмешки я затем применил метод heightForRowAtIndexPath и просто использовал переключатель, чтобы определить, с чем я столкнулся, а затем верну назад высоту ячейки прототипа (из размеров, показанных в дизайнере раскадровки). Это должно было быть простым, жестко закодированным подходом, чтобы выяснить, требуется ли для решения проблемы heightForRowAtIndexPath.

Опять же, отлично работает на iOS 8, но на iOS7 все 3 ячейки сложены друг на друга.

Я думаю, что основной вопрос заключается в следующем: поскольку я использую прототипы с раскадрой, которые имеют фиксированные размеры и ограничения на всех UIComponent в этих прото-ячейках, почему это не работает на iOS 7?

Я пытаюсь избежать добавления тонны кода, просто сделайте эту работу на iOS7.

+0

hmm ... вы пытались запустить приложение на устройствах iOS 7 или симуляторах разных размеров с различными настройками инструмента выравнивания перекрестия на раскадровке? Возможно, это преступник, что что-то не так с вашим выравниванием, когда меняются размеры. Возможно, он правильно отображается на iOS8 только потому, что iOS8 достаточно умен, чтобы исправить эти ошибки для вас. Раньше у меня была аналогичная проблема. Итак, это только моя догадка. Надеюсь это поможет. – minjiera

+0

Компоненты пользовательского интерфейса в каждой ячейке расположены правильно. Проблема в том, что ячейки сложены друг на друга. Похоже, вы взяли три разных UIView и установили их в одно и то же происхождение x/y. Они не отображаются линейно (один за другим) в таблице, как вы ожидали. – Adam

+0

Прямой путь вперед должен работать, я делал это много раз, можете ли вы опубликовать скриншот раскадровки и как настроить эти ячейки? – oren

ответ

1

iOS7 не поддерживает саморазмерные ячейки, реализуя heightForRowAtIndexPath: и вернув правильную высоту, это правильный способ сделать это.

+0

Основываясь на исследовании этого, это было мое предположение. Именно поэтому я применил метод heightForRowAtIndexPath. Это, однако, все же дает все три ячейки визуально сложены друг на друга. Я могу пройти через отладчик и убедиться, что он вызывает код, который должен возвращать правильную высоту ячейки для каждого из разных типов ячеек. К сожалению, он все еще не работает на iOS7, хотя все, что я делал в прошлом, и все, что я нашел об этом в сети, указывает на то, что он должен работать. – Adam

0

Вы вычисляете высоту в «tableView: heightForRowAtIndexPath:»? Может быть, вы должны попытаться сделать это в «tableView: оцененныйHeightForRowAtIndexPath:», потому что, будучи деактивированными ячейками, из-под раскадровки

Смежные вопросы