Установка переменной высоты UITableViewCell в зависимости от его ширины - IPhone - PullRequest
4 голосов
/ 04 февраля 2011

В IPhone tableview ширина содержимого составляет либо 320, либо 300 в зависимости от стиля. Однако, когда Ipad находится на сцене, мы начали использовать таблицы разной ширины в соответствии с нашим дизайном.

Одна проблема заключается в том, что в некоторых случаях мы вычисляем высоту ячейки в соответствии с размером текста субтитров. Высота текста зависит от ширины содержимого, а высота ячейки зависит от высоты текста. Если ширина 300 или 320, все в порядке. Но подумайте, что я использую табличное представление сгруппированных стилей шириной 500 пикселей, и нет способа рассчитать уменьшенную ширину содержимого. Из-за этой проблемы мы не можем рассчитать высоту звонка в зависимости от его содержания.

Единственным местом, где мы можем получить информацию о ширине содержимого ячейки, является метод подклассов layoutsubview. Однако heightForRowAtIndexPath вызывается перед методом layoutSubview, и у нас нет информации о ширине содержимого сокращенной ячейки.

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

Буду рад любой помощи.

Спасибо.

М Али Калискан

Ответы [ 4 ]

1 голос
/ 07 февраля 2011

Наконец я решил проблему ширины сгруппированного tableView. Размер отступа, равный 10 (в одну сторону) для стандартной ширины 320, изменяется в зависимости от ширины интересной математики. Простой способ справиться с этой математикой - использовать фиксированные значения в соответствии с диапазонами ширины. Приведенный ниже код действителен для 4.0, и я не проверял его ни в какой другой версии iOs.

Пожалуйста, умножьте возвращенный размер заполнения на 2, чтобы найти общее уменьшение сгруппированного стиля tableView. Например, если размер paddign равен 10 для табличного представления шириной 320 пикселей, contentWidth составляет 320 - (2.10) = 300.

CGFloat GetTableViewPaddingSize(CGFloat tableViewWidth)
{
    if (tableViewWidth < 401) {
        return 10;
    } else if (tableViewWidth < 547) {
        return 31;
    } else if (tableViewWidth < 560) {
        return 32;
    } else if (tableViewWidth < 573) {
        return 33;
    } else if (tableViewWidth < 586) {
        return 34;
    } else if (tableViewWidth < 599) {
        return 35;
    } else if (tableViewWidth < 612) {
        return 36;
    } else if (tableViewWidth < 625) {
        return 37;
    } else if (tableViewWidth < 639) {
        return 38;
    } else if (tableViewWidth < 652) {
        return 39;
    } else if (tableViewWidth < 665) {
        return 40;
    } else if (tableViewWidth < 678) {
        return 41;
    } else if (tableViewWidth < 691) {
        return 42;
    } else if (tableViewWidth < 704) {
        return 43;
    } else if (tableViewWidth < 717) {
        return 44;
    } else {
        return 45;
    }
}
0 голосов
/ 04 февраля 2011

NSString UIKit Additons (найдено здесь ) предоставляет множество методов для определения размера строки в конкретном UIFont и режиме разрыва строки (помните, что String, UIFont и т. Д. Могут исходить от классов вашей модели,так что все это известно до того, как UITableView должен будет отображаться).Вы можете использовать эти методы в сочетании с вашими личными пробелами / отступами / и т.д.чтобы определить желаемый размер (то есть ширину и высоту) UITableViewCell во время вызова heightForRowAtIndexPath:.

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

0 голосов
/ 04 февраля 2011

Как упоминал и объяснял Джеймс, вы можете использовать что-то вроде

UIFont *font = [UIFont systemFontOfSize:16];    
CGSize size = [TEXT_STRING sizeWithFont:font constrainedToSize:CGSizeMake(tableView.frame.size.width, 16*1000.f) lineBreakMode:UILineBreakModeCharacterWrap];
return size.height;

Используйте это в делегате heightForRowAtIndexPath:, а также в cellForRowAtIndexPath:, чтобы возвратить высоту для tablecell и обновить кадр ячейки..

Надеюсь, это может вам чем-то помочь.

0 голосов
/ 04 февраля 2011

У меня была аналогичная проблема , а именно, что ширина contentView ячейки таблицы неизвестна, когда вызывается heightForRowAtIndexPath, если у вас есть дополнительное представление.В конце концов, не было никакого решения, кроме как жестко закодировать ширину вспомогательного вида (20 пикселей) и вычесть ее из обычной ширины.Я думаю, вам придется сделать то же самое - жестко закодировать ширину содержимого ячейки в зависимости от полной ширины табличного представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...