Frage

Ich versuche, die visuelle Größe eines NSString zu messen, die die Anzahl der Zeilen berücksichtigt ich machen kann. Allerdings nimmt sizeWithFont nicht berücksichtigt NumberOfLines Eigentum? Also mein Layout-Algorithmus positioniert alles niedriger, als sie eigentlich sein müssen.

_price = [[UILabel alloc] init];
_price.text = myPriceValue;
_price.lineBreakMode = UILineBreakModeWordWrap;
_price.numberOfLines = 3;
_price.backgroundColor = [UIColor clearColor];
_price.textColor = TTSTYLEVAR(colorPrice);
/// the follow code ignores numberOfLines and just tells me the size of the whole block.  
// I'd like it to be aware of numberOfLines
//
CGSize priceSize = [_price.text sizeWithFont:_price.font
        constrainedToSize:CGSizeMake(maxWidth, CGFLOAT_MAX)
        lineBreakMode:UILineBreakModeWordWrap];

Wer weiß, wie dies zu tun mit dem iPhone SDK?

War es hilfreich?

Lösung

Statt CGFLOAT_MAX für die maximale Höhe des Textes Berechnung, versuchen, die Größe einer Zeile mit dieser bekommen:

[_price.text sizeWithFont:_price.font].height

und dann multiplizieren, dass durch die maximale Anzahl der Zeilen wollen Sie, dann ist das in der Höhe der Größe Verstopfen Sie selbst beschränke zu. Es würde wahrscheinlich so aussehen:

_price = [[UILabel alloc] init];
_price.text = myPriceValue;
_price.lineBreakMode = UILineBreakModeWordWrap;
_price.numberOfLines = 3;
_price.backgroundColor = [UIColor clearColor];
_price.textColor = TTSTYLEVAR(colorPrice);
CGFloat lineHeight = [_price.text sizeWithFont:_price.font].height;
CGSize priceSize = [_price.text sizeWithFont:_price.font
        constrainedToSize:CGSizeMake(maxWidth, lineHeight * _price.numberOfLines)
        lineBreakMode:UILineBreakModeWordWrap];

Diese Mitteilung nicht verwenden, wenn Sie jemals Anzahl der Zeilen auf 0 als Ihre maximale Höhe eingestellt werden 0 in diesem Fall; Sie sollten CGFLOAT_MAX verwenden dann.

Andere Tipps

Mit der UILabel des sizeToFit statt sizeWithFont: ein mehrzeiliges UILabel Layout, da sizeWithFont: den String (siehe Apfel docs) gestutzt. Der folgende Code reduziert die Schriftgröße eines Etiketts, bis der Text passen in eine der angegebenen Größe ... mehrere Textzeilen verwendet werden, sobald sie in die angegebene Höhe passen:

-(void)setFontSizeOfMultiLineLabel: (UILabel*)label 
        toFitSize: (CGSize) size 
        forMaxFontSize: (CGFloat) maxFontSize 
        andMinFontSize: (CGFloat) minFontSize 
        startCharacterWrapAtSize: (CGFloat)characterWrapSize{

CGRect constraintSize = CGRectMake(0, 0, size.width, 0);
label.frame = constraintSize;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0; // allow any number of lines

for (int i = maxFontSize; i > minFontSize; i--) {

    if((i < characterWrapSize) && (label.lineBreakMode == UILineBreakModeWordWrap)){
        // start over again with lineBreakeMode set to character wrap 
        i = maxFontSize;
        label.lineBreakMode = UILineBreakModeCharacterWrap;
    }

    label.font = [label.font fontWithSize:i];
    [label sizeToFit];
    if(label.frame.size.height < size.height){
        break;
    }       
    label.frame = constraintSize;
  } 
}

Rufen Sie diese mit einem Etikett, das Ihren Liebling Text und Schriftart hat:

UILabel *label = [[UILabel alloc] initWithFrame: CGRectZero];   
label.backgroundColor = [UIColor clearColor];   
label.textColor = [UIColor whiteColor];
label.text = text;
label.font = [UIFont fontWithName: @"Helvetica" size: 16];
[self setFontSizeOfMultiLineLabel: label toFitSize: CGSizeMake(200, 44) forMaxFontSize: 16 andMinFontSize: 8 startCharacterWrapAtSize: 11]; 

Der startCharacterWrapAtSize Parameter können Sie wählen characterWrap Ausgangsgröße bei der Angabe der Schriftart verwenden. Dies sollte Raum für den Fall speichern wordWrap würde wirklich kleine Schriftarten verwenden.

edit: Bugfix

Anstatt zu versuchen, es in einem Aufruf zu tun, so etwas wie dies (verzeihen Sie den Pseudo-Code, es ist spät):

NSString *s = _price.text;
UIFont *font = _price.font;
CGFloat fontSize = font.pointSize;

while (TRUE)
{
   CGSize priceSize = [s sizeWithFont: font constrainedToSize: 
       CGSizeMake(maxWidth, fontSize) lineBreakMode: UILineBreakModeWordWrap];

    if ( /* priceSize is satisfactory */ )
    {
        break; // Make sure this exits, eventually!!!
    }
    fontSize -= 1.0; // or a smaller decrement if you like
    font = // new, smaller font

}

Die richtige Antwort ist, natürlich, müssen Sie NumberOfLines auf 0 setzen, die den Rahmen verursacht das Ergebnis mit jedoch viele Zeilen berechnen sie braucht. Siehe auch diese Frage .

Natürlich nehmen sie es nicht in Betracht, da nichts genannt zu werden oder übergeben, diese Informationen hat. Sie arbeiten streng mit Streichern, Größen und Schriftarten. Es ist die Bezeichnung, die die Anzahl der Zeilen in ihm hat.

Ich bin mir nicht sicher, was genau das Problem ist; bekommen Sie eine Größe, die zu groß oder zu klein ist, oder was? Sie können die Anzahl der Zeilen des Textes herausfinden, indem die Höhe der Schriftart, die Höhe des Ergebnisses Teilung, die der Wert des ascender plus dem Abseilgerät, glaube ich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top