2016-02-04 3 views
0

У меня проблема с динамическими ячейками изменения размера Apple, так что логика расположения моих ячеек не такая резкая и сухая, как только несколько сложены растущих UILabels.iOS Рассчитайте высоту для ячейки

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

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

Мне по существу нужно пойти и скопировать мои ограничения в константу, а затем использовать эти значения в методе класса для генерации моих высот. Apple дает очень мало внутреннего понимания того, как работает UITableViewAutomaticDimension, но ясно, что высота ячейки все еще вычисляется ДО того, как она выложена. Таким образом, я не могу добавить к нему какую-либо сложную логику, если не знаю, какие методы вызывают раньше.

Любые идеи о том, что я должен делать, или если мой подход в порядке?

+1

«Логика расположения моих ячеек не такая резкая и сухая» - какова логика? – kelin

+0

boundingRect - это неправильный способ вычисления метки (или любого другого) размера, -sizeToFit или -sizeThatFits: являются правильными – Andrea

+0

@kelin У меня есть две метки. Если ширина левой метки нарезается на правую метку, переместите правую метку под левой меткой. Если левая метка берет несколько строк, также перемещайте правую метку под левой меткой. –

ответ

0

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

+0

Да, но где я могу изменить ограничение по высоте? LayoutSubviews вызывается слишком поздно - высота ячейки определяется этой точкой. Если я установил его сразу после инициализации, фреймы для всех подзонов ошибочны. –

0

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

Это проще и дает вам гибкость, не прибегая к слишком большому количеству методов делегатов табличного вида. Централизовать логику компоновки в одном месте. Другая альтернатива - переопределить layoutSubviews ячейки представления таблицы и рассчитать высоту там и сохранить ее.

+0

Спасибо, я вижу, что метод прототипа типа ячейки более распространен, чем я ожидал. Мне нравится второй метод, который вы описали лучше, но это не работает. layoutSubviews вызывается после вычисления высоты, поэтому я не буду иметь высоту во времени. –

+0

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

0

Если вы хотите, чтобы ячейка tableview была назначена по умолчанию, вы можете использовать оценочную диаграммуHeightForRowAtIndexPath: доступную в UITableViewDelegate. В соответствии с рекомендациями Apple:

// Используйте методы valuight, чтобы быстро вычислить угаданные значения, которые позволят быстро загружать таблицу. // Если эти методы реализованы, вызовы выше-tableView: heightForXXX будут отложены до тех пор, пока представления не будут готовы к отображению, поэтому там может быть размещена более дорогая логика.

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