2013-02-15 2 views
2

Если я делаю заказ UITableViewCell, и мне нужно, чтобы он имел переменную высоту в зависимости от длины ввода (например, для читателя Twitter или что-то еще), как я могу это сделать Работа?heightForRowAtIndexPath с пользовательской ячейкой и меткой

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

Существует ли стандартизированный способ проектирования ячейки (например, насколько высок я должен сделать это в Interface Builder?) , и, допустим, мой ярлык был половиной ширины этой ячейки. Как бы я мог рассчитать высоту ячейки, которая должна отображаться в строке, загруженной в эту метку? Вот метод, который я нашел здесь, который отлично работает на нормальной ячейке, но прикручивает пользовательские с необычными высотами, перекрывающимся текстом и т. Д .: (я абсолютно НЕ знаю, что здесь делает 300/200000, если кто-нибудь может объяснить, d быть благодарными, тоже!)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGSize textSize = {300.f, 200000.0f}; 
    CGSize size = [[_quoteStringsFromPlist objectAtIndex: indexPath.row] sizeWithFont: [UIFont systemFontOfSize:12.0f] constrainedToSize: textSize lineBreakMode: NSLineBreakByWordWrapping]; 
    size.height += 5.0f; 
    float result = MAX(size.height, 32.0f); 
    return result; 
} 
+0

Вы можете сделать все это в построителе интерфейса (если вы с этим согласны). В IB выберите таблицу и измените высоту строки. Затем выберите ячейку и выберите пользовательскую высоту ячейки и введите тот же номер. Надеюсь, поможет! – Groot

+0

Это не сработало, боюсь. Кажется, что клетки находятся на разных высотах, но короткие имеют массу пространства выше/ниже их, а более длинные - обрезаны. Я установил высоту строки до 90 в обоих местах. – Luke

ответ

0

Нечто подобное должно работать.

CGRect labelFrame = // enter default frame of the label here 
UIFont *labelFont = // enter label font here 
CGFloat labelBottomMargin = // enter the space between the bottom of the label and the bottom of the cell here 

CGSize size = [labelString sizeWithFont:labelFont constrainedToSize:CGSizeMake(labelFrame.size.width, MAX_FLOAT)]; 
size.height += labeFrame.origin.y; 
size.height += labelBottomMargin; 
size.height = MAX(size.height, 32.0f); 
return size.height; 
+0

Это делает их ВСЕ ПУТЕМ слишком высокими, как более чем в два раза больше, чем они должны быть. – Luke

+0

Кроме того, откуда взялся 32.0f? – Luke

+0

Он исходит от вас. Из вашего исходного кода я предположил, что 32.0f - минимальная высота, которую вы хотели для своей ячейки. Код, который я предоставил, должен работать, если вы ввели правильные значения для labelFrame, labelBottomMargin и labelFont. – user941868

0

Во-первых, над головой в файл XIb и посмотреть, насколько велики верхние/нижние края текста области, и насколько широко она.

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

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

EDIT

Представьте, что ваш размер ячейки в вашем IB {700, 300}, и ваш текст Район расположен на {{100, 100}, {300,100}}, текст область имеет 100px запас верхние и 100px маржи бот, и это ширина 300.

Когда вы вычисляете высоту, требуемую для текста, вы вычисляете ее с доступной шириной 300. Он вернет размер, что-то вроде {300, 250}. Это 250 - это высота, требуемая вашим текстом, но в вашей ячейке есть другие вещи, и вам нужно добавить к ней те верхние и бот-поля, поэтому результат равен 450.

Не забудьте установить маску автоопределения или автозапуск, чтобы что ваша текстовая область простирается вертикально, а поля фиксированы (UIViewAutoresizingFlexibleHeight)

+0

Не могли бы вы привести пример? Я не совсем это понимаю. Моя текстовая область в раскадровке имеет ширину 159 и 74 высоких (при X 234 и Y 45, если это имеет значение). Я не уверен, что вы подразумеваете под маркой. – Luke

+0

Каково имя свойства для полей текста? – AlexWien

+0

Я не знаю, что такое авторезистирующие маски. Мне жаль, что здесь проблема, но я до сих пор не знаю, что вы подразумеваете под этим ответом. – Luke