2013-10-03 12 views
12

Kennt jemand eine Arbeit herum oder was mache ich derzeit hier falsch.NSString BoundingRectWithSize Bounding wird nicht respektiert

CGSize boundingSize = CGSizeMake(288, 9999); 

CGRect boundingRect = [text boundingRectWithSize:boundingSize 
               options:NSStringDrawingUsesLineFragmentOrigin 
               attributes:[NSDictionary dictionaryWithObjectsAndKeys:theFont, NSFontAttributeName, nil] 
               context:nil]; 

Wenn der Code läuft auf iOS7 (beide auf dem Telefon und SIM), um die Größe zurückgekehrt ist 416,3 breit mit einer Höhe von 15,5. Offensichtlich wird die boundingRectWithSize gerade ignoriert. Ist jemand anders dazu gekommen und wenn ja, hat irgendjemand eine Idee, wie man es beheben kann oder kann mich jemand darauf hinweisen, wo ich falsch liege.

+0

Haben Sie das herausgefunden? –

+0

Ich habe das gleiche Problem –

Antwort

3

Gemäß den Apple documentation:

können Sie diese Methode verwenden, um den Raum zu berechnen, benötigt, um die Zeichenfolge zu ziehen. Die Einschränkungen, die Sie im Parameter Größe angeben, sind eine Anleitung für den Renderer für die Größe der Zeichenfolge. Das tatsächliche Begrenzungsrechteck, das von dieser Methode zurückgegeben wird, kann jedoch größer als die -Einschränkungen sein, wenn zusätzlicher Speicherplatz benötigt wird, um die gesamte Zeichenfolge zu rendern. In der Regel behält der Renderer die Breitenbeschränkung bei und passt die Höhenbeschränkung nach Bedarf an.

Wenn Sie eine feste Schriftart und einen zu kleinen Platz angeben, muss etwas geben. In diesem Fall ist es der Begrenzungsraum. Ich nehme an, du erwartest Zeilenumbruch. Erlaubt eine Breite von 288 vernünftige Wraps?

+2

Das ist gut und gut, aber ich frage es, Text in einem Raum zu zeichnen, der 288 breit und 9999 hoch ist. Es gibt einen Wert von 416 breit und 15 hoch. Es ist eindeutig genug Platz für die Höhe gegeben. Ich möchte nur die Breite fest und es mir die Höhe zurückgeben, aber es scheint, dass dort ein Problem ist. Gibt es etwas zu tun, was ich gerade verpasse? – BrettS

+0

Zeilenumbrüche sind auf "Zeilenumbruch" und "Autoschrumpf" auf "Feste Schriftgröße" eingestellt. – BrettS

+0

Was passiert, wenn Sie es in dem von Ihnen angegebenen Raum mit drawInRect eingeben:? –

1

Ich weiß, dass dies eine alte Frage ist, aber ich habe einen Workaround für Ihr Problem gefunden. unten ist das Codebeispiel

1) Zuerst ein Makro Höhe Mindest erstellen

#define MIN_HEIGHT 10.0f 

2) Nach diesem Einsatz unter Code variabler Höhe festgelegt, basierend auf Ihrem Text zu geben. Dafür müssen Sie jedoch den Rahmen für UILabel oder den für die Anzeige des Textes verwendeten Rahmen angeben.

// Initialize UILabel with initial frame. 
UILabel *lblMakeModel = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, 180, 50)]; 
// Set numberOfLines as zero 
lblMakeModel.numberOfLines = 0; 
// Set text here 
lblMakeModel.text = @"sdbsbdjhsbdhjsbdhjasd bhbdhjasbdsahjdbahjsdbjhsd bdhjsabdhjsbdhsbdhsad dhbsadbasdhbsajhdbsadyogi"; 
// create a constraint for fixed width and maximum 20000 height. 
CGSize constraint = CGSizeMake(lblMakeModel.frame.size.width, 20000.0f); 
// Get the CGRect with the given constraint for the text of UILabel 
CGRect textRect = [lblMakeModel.text boundingRectWithSize:constraint 
             options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
             attributes:@{NSFontAttributeName:lblMakeModel.font} 
             context:nil]; 

// Set LineBreakMode for UIlabel 
[lblMakeModel setLineBreakMode:NSLineBreakByWordWrapping]; 
[lblMakeModel setAdjustsFontSizeToFitWidth:NO]; 
// Again set the frame from the height you get from CGRect object. 
[lblMakeModel setFrame:CGRectMake(lblMakeModel.frame.origin.x, lblMakeModel.frame.origin.y, lblMakeModel.frame.size.width, MAX(textRect.size.height, MIN_HEIGHT))]; 
0

Es ist ein echter Fehler existiert nach wie vor in der Methode „boundingRectWithSize“, manchmal gibt es falsche Breite größer als die begrenzte Breite, ich löste es durch diese Arbeit um und die Etikettenhöhe nach der Methode „sizeToFit“ erhalten

UILabel *textLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0,maxTextWidth, CGFLOAT_MAX)]; 

[textLabel setNumberOfLines:0]; 
[textLabel setFont:Font]; 
[textLabel setLineBreakMode:NSLineBreakByWordWrapping]; 
[textLabel setText:@"Text bla bla bla"]; 
[textLabel sizeToFit]; 
float height = textLabel.frame.size.height; 
Verwandte Themen