Определение размера UILabel?

Как изменить следующий fragment (в методе tableView: cellForRowAtIndexPath: UITableViewController) из рецепта «09a – PrefsTable» из главы 6 «Поваренной книги разработчиков iPhone»:

if (row == 1) { // Create a big word-wrapped UILabel cell = [tableView dequeueReusableCellWithIdentifier:@"libertyCell"]; if (!cell) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"libertyCell"] autorelease]; [cell addSubview:[[UILabel alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 280.0f, 330.0f)]]; } UILabel *sv = [[cell subviews] lastObject]; sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; sv.textAlignment = UITextAlignmentCenter; sv.lineBreakMode = UILineBreakModeWordWrap; sv.numberOfLines = 9999; return cell; } 

… размер «sv» UILabel subview и «cell» UITableViewCell будет иметь размер, достаточно большой, чтобы соответствовать тексту (и работать с более или менее текстом и другими типами выравнивания текста)? Я посмотрел на метод UILabel textRectForBounds: limitedToNumberOfLines :, но в документации указано, что его нельзя вызывать напрямую (и его следует переопределять). Я экспериментировал с методом UIView sizeToFit без успеха.

Обновление: я задал новый вопрос о моей проблеме с методом NSString -sizeWithFont: forWidth: lineBreakMode:.

Я должен был сделать это достаточно, чтобы продлить UILabel, чтобы сделать это для меня:

 @interface UILabel (BPExtensions) - (void)sizeToFitFixedWidth:(CGFloat)fixedWidth; @end @implementation UILabel (BPExtensions) - (void)sizeToFitFixedWidth:(CGFloat)fixedWidth { self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0); self.lineBreakMode = NSLineBreakByWordWrapping; self.numberOfLines = 0; [self sizeToFit]; } @end 

то для того, чтобы метка имела переменную многострочную высоту, но фиксированную ширину:

[myLabel sizeToFitFixedWidth:kSomeFixedWidth];

Вы должны использовать NSString -sizeWithFont:forWidth:lineBreakMode: метод для получения связанных показателей размера для вашей метки.

Кроме того, измените свойство numberOfLines на 0 если вы собираетесь использовать этот код.

NSString -sizeWithFont:forWidth:lineBreakMode: фактически не выполняет перенос слов. Вместо этого используйте -sizeWithFont:constrainedToSize:lineBreakMode: чтобы получить точное значение ширины и высоты для строки.

Попробуй это:

 sv.text = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; sv.textAlignment = UITextAlignmentCenter; sv.lineBreakMode = UILineBreakModeWordWrap; sv.numberOfLines = 0; [sv sizeToFit]; 

Кроме того, вам нужно будет реализовать метод UITableViewDelegate:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

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

Еще одна заметка – Размер для Fit должен действительно работать, если у вас есть количество строк, установленных на 0, как упоминалось ранее. Это даст вам обратно размер с увеличенной высотой, чтобы разместить текст, обернутый словом, на этикетке, а ширина – на ширину оригинальной метки.

Это вам не поможет, так как вам нужно получить размер в heightForRow до того, как будет получена ячейка, поэтому вам лучше рассчитать требуемую высоту (и, скорее всего, кешировать этот расчет, чтобы не замедлять рендеринг таблицы)

Вот немного кода, который я использую:

 CGSize textSize = [myLabel.text sizeWithFont:myLabel.font]; 

У меня была аналогичная проблема, у меня был UITableViewCell, который был разработан в StoryBoards как статическая ячейка. Я использовал [super tableView:cellForRowAtIndexPath:] чтобы получить его. Поэтому я хотел resize «detailTextLabel» в UILabel, чтобы он соответствовал тексту, который я ему задал. Стиль был «Right Detail».

Я просто установил текст в моей tableView:cellForRowAtIndexPath: И чем в tableView:heightForRowAtIndexPath: я вернулся

 UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; return cell.detailTextLabel.frame.size.height 

У меня была длинная цепочка. И, наконец, широкая ячейка с 4 строками текста в ярлыке.

У меня была схожая проблема. Я решил это.

В методе cellForRowAtIndexPath задайте размер шрифта по своему желанию.

 cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; [cell.textLabel setFont:[UIFont systemFontOfSize:14.0]]; [cell.textLabel sizeToFit]; 

А метод heightForRowAtIndexPath увеличивает размер шрифта.

  CGFloat height; UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; NSString *text = cell.detailTextLabel.text; CGSize constraint = CGSizeMake(320, 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:20.0] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; CGFloat calHeight = MAX(size.height, 44.0f); height = calHeight + (CELL_CONTENT_MARGIN * 2); return height; 
Interesting Posts

Измените цвет текста одного ClickableSpan при нажатии, не затрагивая другие ClickableSpans в том же TextView

Что такое сеансы? Как они работают?

Напишите мне, когда кто-нибудь запустит sudo

Удаленный рабочий стол Windows: «настройка удаленного сеанса» закрывается без ошибок

ошибка с varargs и перегрузка?

Как остановить ASP.NET от изменения идентификаторов, чтобы использовать jQuery

Есть ли буквальный синтаксис словаря или массива в Objective-C?

Как сделать хорошие воспроизводимые примеры Apache Spark Dataframe

Коллекция была изменена; перечисление не может выполнить ошибку при удалении ListItem из LIstBox

В C ++ 11, имеет ли `i + = ++ i + 1` неопределенное поведение?

Как вы получаете встроенный инструмент сравнения Eclipse, чтобы игнорировать различия в пробелах?

Проблемы с файловыми путями в R с использованием Windows (ошибка «шестнадцатеричные цифры в символьной строке»)

Java: префикс / постфикс операторов increment / decment?

Как выполнить команду при каждом изменении файла?

Сжатие больших файлов

Давайте будем гением компьютера.