Определение размера UILabel, чтобы соответствовать? - PullRequest
43 голосов
/ 02 января 2009

Как изменить следующий фрагмент (в методе 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 и ячейки "UITableViewCell" был достаточно велик, чтобы вместить текст (и работать с большим или меньшим количеством текста и другими типами выравнивания текста)? Я посмотрел на UILabel textRectForBounds: limitedToNumberOfLines: метод, но в документации говорится, что он не должен вызываться напрямую (и должен быть только переопределен). Я экспериментировал с методом UIView sizeToFit, но безуспешно.

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

Ответы [ 9 ]

98 голосов
/ 18 мая 2010

Я должен был сделать это достаточно, чтобы расширить 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];

17 голосов
/ 02 января 2009

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

10 голосов
/ 02 января 2009

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

5 голосов
/ 16 апреля 2009

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

4 голосов
/ 03 февраля 2010

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

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]; 
2 голосов
/ 02 января 2009

Также вам необходимо реализовать метод UITableViewDelegate:

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

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

Еще одно примечание - Size to Fit должен действительно работать, если у вас есть число строк, равное 0, как упомянуто ранее. Он вернет вам размер с увеличенной высотой, чтобы вместить завернутый в слово текст, заданный в метке, и ширину, равную ширине оригинальной метки.

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

1 голос
/ 16 мая 2011

Вот код, который я использую:

CGSize textSize = [myLabel.text sizeWithFont:myLabel.font];
0 голосов
/ 22 марта 2013

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

В методе 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;
0 голосов
/ 03 сентября 2012

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

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

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

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

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