2013-03-07 3 views
3

Я использую следующие два метода (один из них относится к категории NSString, а другой категории UILabel), чтобы автоматически регулировать высоту метки на основе текста внутри нее. Он отлично работает для большинства, но он имеет некоторые непредсказуемые результаты. Я не совсем уверен, где эта проблема может возникнуть, и я надеюсь, что некоторые из вас прекрасные люди могут предложить руку помощи. Во-первых, здесь методы в вопросе:Автоматическая регулировка высоты UILabel

NSString Категория:

- (CGFloat) fontSizeWithFont: (UIFont *) font constrainedToSize: (CGSize) size minimumFontSize: (CGFloat) minimumFontSize 
{ 
    CGFloat fontSize = [font pointSize]; 
    CGFloat height = [self sizeWithFont: font constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height; 
    UIFont *newFont = font; 

    // Reduce font size while too large, break if no height (empty string) 
    while (height > size.height && height != 0 && fontSize > minimumFontSize) { 
     fontSize--; 
     newFont = [UIFont fontWithName: font.fontName size: fontSize]; 
     height = [self sizeWithFont: newFont constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height; 
    }; 

    // Loop through words in string and resize to fit 
    for (NSString *word in [self componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]) { 
     CGFloat width = [word sizeWithFont: newFont].width; 
     while (width > size.width && width != 0 && fontSize > minimumFontSize) { 
      fontSize--; 
      newFont = [UIFont fontWithName: font.fontName size: fontSize]; 
      width = [word sizeWithFont: newFont].width; 
     } 
    } 
    return fontSize; 
} 

UILabel Категория:

- (void) sizeToFitMultipleLines 
{ 
    if (self.adjustsFontSizeToFitWidth) { 
     CGFloat adjustedFontSize = [self.text fontSizeWithFont: self.font constrainedToSize: self.frame.size minimumFontSize: self.minimumScaleFactor]; 
     self.font = [self.font fontWithSize: adjustedFontSize]; 
    } 
    [self sizeToFit]; 
} 

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

Во-вторых, ширина метки иногда регулируется там, где требуется только изменение высоты. Я предполагаю, что [self sizeToFit] является причиной этой конкретной проблемы, но я не совсем уверен, так как высота остается неуправленной, если я удалю ее. EDIT: Я исправил эту проблему ширины, вручную переставив метку после ее размера, чтобы она соответствовала (ее координата X теперь составляет ширину экрана минус ширина метки, разделенная на 2).

Любые мысли? Если вам нужна дополнительная информация или код, пожалуйста, спросите. Я всегда устанавливаю шрифт, прежде чем я вызову метод [sizeToFitMultipleLines] на соответствующих ярлыках, так что это не проблема.

ответ

6

Я пробовал это и его работу для меня. Надеюсь, это поможет вам немного.

-(void) getDynamicHeightWithString:(NSString*)labelText forWidth:(CGFloat)lblWidth forPoint:(CGPoint)point 
{ 
    //Create Label 
    UILabel *label = [[UILabel alloc] init]; 
    label.text = labelText; 
    label.numberOfLines = 0; 
    label.lineBreakMode = NSLineBreakByWordWrapping; 

    //Set frame according to string 
    CGSize size = [label.text sizeWithFont:label.font 
         constrainedToSize:CGSizeMake(lblWidth, MAXFLOAT) 
          lineBreakMode:UILineBreakModeWordWrap]; 
    [label setFrame:CGRectMake(point.x , point.y , size.width , size.height)]; 

    //Add Label in current view 
    [self.view addSubview:label];  

} 

USE

NSString *labelText = @"We are what our thoughts have made us; so take care about what you think. Words are secondary. Thoughts live; they travel far.The issue that's occurring is that the height of the label has empty space at its top and bottom, and that the longer the string inside it is, the larger that empty space is. A single line label might have perhaps 10 pixels above and below it inside the label's frame, but a six-line string may have almost 100 pixels. I'm not able to track down where this extra space is coming from in the methods above."; 

[self getDynamicHeightWithString:labelText forWidth:200 forPoint:CGPointMake(15, 15)]; 
+0

Я использовал вариации этого, чтобы заставить его работать. Вопрос был фактически расстоянием между этим ярлыком и другим, а не меткой, установленной неверно. – Luke