2013-10-28 6 views
5

Я пытаюсь вычислить высоту для UITableViewCell, поэтому я определил метод класса, который выглядит как этотUILabel sizeThatFits не работает

+ (CGFloat)heightWithText:(NSString *)text 
{ 
    SizingLabel.text = text; 
    [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)]; 

    return (TOP_MARGIN + SizingLabel.frame.size.height + BOTTOM_MARGIN); 
} 

Я определил SizingLabel как это:

+ (void)initialize 
{ 
    SizingLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 
    SizingLabel.numberOfLines = 0; 
    SizingLabel.lineBreakMode = NSLineBreakByWordWrapping; 
} 

Однако, если я придерживаюсь точки останова в методе -heightWithText:, я замечаю, что размеры SizingLabel никогда не меняются, и поэтому я получаю неправильное значение. Почему это?

+1

- (CGSize) sizeThatFits: возвращает размер, в котором текст получить пригодный для вашей этикетки. – OMK

+0

ahh ok это действительно не изменяет размер этикетки? –

+0

Да, он просто возвращает вам размер. – OMK

ответ

4
+ (CGFloat)heightWithText:(NSString *)text 
{ 
    SizingLabel.text = text; 
    CGSize labelSize = [SizingLabel sizeThatFits:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)]; 

    return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN); 
} 
+2

не работает для UILabel. – BSKANIA

+0

Работает для UILabel, если для метки установлен шрифт. – OlgaVogue

+2

@ OlgaVogue Нет, он работает только иногда. sizeThatFits, как известно, багги. – Kevin

0

ниже код, чтобы вычислить прямоугольник для динамической длины текста (ios7 версия)

- (CGRect)labelFrameWithText:(NSString *)text 
{ 
    CGRect rect; 

    // the font of your text 
    UIFont *font = [UIFont systemFontOfSize:15.0]; 
    NSDictionary *attributes = @{NSFontAttributeName: font}; 

    // the first parametric CGSize is the max size that the rect's size can be 
    CGRect boundingRect = [text boundingRectWithSize:CGSizeMake(youImageWidth, 100.0) 
               options:NSStringDrawingUsesLineFragmentOrigin 
              attributes:attributes 
               context:nil]; 

    //the rect of the UILabel 
    //This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function. 
    rect = CGRectMake(yourLabelOriginX, 
         yourLabelOriginY, 
         ceil(boundingRect.size.width), 
         ceil(boundingRect.size.height)); 

    return rect; 
} 

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

--- ------------- старая версия -------------------

CGSize contentSize = [content sizeWithFont:font 
          constrainedToSize:CGSizeMake(maxWidth, maxHeight) 
           lineBreakMode: NSLineBreakByWordWrapping]; 
+0

Не работает должным образом с обернутым и приписываемым текстом – hybridcattt

+0

Атрибуты (NSDictionary) - это то, где вы устанавливаете свои текстовые атрибуты. – Jing

3

ли это в вашем сотовом пользовательский класс:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

     //Message Label 
     lbl_name = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 25)];    

     [lbl_name setFont:[UIFont fontWithName:@"Helvetica" size:16.0f]]; 
     lbl_name.lineBreakMode = UILineBreakModeWordWrap; 
     lbl_name.numberOfLines = 0; 
     [lbl_name sizeToFit]; 
     [self.contentView addSubview:lbl_name]; 

     //Time 
    } 
    return self; 
}  

-(void)resizeNameLabel:(NSString *)text 
{ 
    CGSize constraint = CGSizeMake(300 , 20000.0f); 
    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:16.0f] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 
    [lbl_name setFrame:CGRectMake(10, 5, 300, MAX(size.height, 25.0f))];//300 Label Width 
    [lbl_name setText:text]; 
} 

Делайте это в основном классе ..

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    if (cell == nil) 
    { 
     cell = (CustomCell *)[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 
    } 
     [((CustomCell *)cell) resizeNameLabel:text]; 

    return cell; 
} 

Просто сделай так ...

0

Для простого проклейки UILabels, которые приписываются текст, я добавил эту категорию в UILabel.

@implementation UILabel (PAUtils) 

- (CGSize)jb_attributedSizeThatFits:(CGSize)size 
{ 
    CGRect textRect = [self.attributedText boundingRectWithSize:size options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil]; 
    return textRect.size; 
} 

@end 

Две вещи, чтобы отметить:

  1. Когда не устанавливая attributedText (но вместо того, чтобы просто использовать text) этот метод не учитывает numberOfLines свойства.
  2. boundingRectWithSize возвращает доли пунктов. Если вы используете значения, возвращаемые этим методом для макетов, вы должны, вероятно, ceilf ширину и высоту.
3

Как было сказано выше, sizeThatFits: (и, таким образом, sizeToFit) не очень хорошо работают с UILabel объектов.

Лучше использовать предпочтительную textRectForBounds:limitedToNumberOfLines: метод:

+ (CGFloat)heightWithText:(NSString *)text 
{ 
    resizingLabel.text = text; 
    CGSize labelSize = [resizingLabel textRectForBounds:CGRectMake(0.0, 0.0, LABEL_WIDTH, CGFLOAT_MAX) 
           limitedToNumberOfLines:0].size; // No limit 

    return (TOP_MARGIN + labelSize.height + BOTTOM_MARGIN); 
} 
+0

Не работает для меня. Кроме того, вы должны следовать соглашению об именах и начинать имена переменных в нижнем регистре (или ' SizingLabel' должен быть классом?) – Daniel

+0

'SizingLabel'must была автоматической проблемой переименования. Также вы или кто-нибудь можете редактировать сообщения;) Что касается этого не работает. Какая часть проблемы? В основном этот код использует только встроенный 'textRectForBounds: limitedToNumberOfLines:', который всегда должен работать. – Rivera

+0

он возвращал размер, который на самом деле не отражал размер текста. В конце концов, он не учитывает шрифт. Я закончил использование 'NSString boundingRectWithSize: options: attributes: context:'. – Daniel

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