2013-10-03 4 views
12

Qualcuno sa di un problema o di ciò che sto facendo attualmente in modo errato.Limitazione NSStringRectWithIl limite non viene rispettato

CGSize boundingSize = CGSizeMake(288, 9999); 

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

Quando il codice viene eseguito su iOS7 (sia al telefono e sim) la dimensione restituita è 416,3 di larghezza con un'altezza di 15,5. Chiaramente il boundingRectWithSize viene semplicemente ignorato. Qualcun altro ha trovato questo e se così qualcuno ha un'idea su come risolverlo o qualcuno può indicarmi dove sto andando male.

+0

Hai capito? –

+0

Ho lo stesso problema –

risposta

3

Come per il Apple documentation:

È possibile utilizzare questo metodo per calcolare lo spazio necessario per disegnare la stringa . I vincoli specificati nel parametro size sono una guida per il renderer su come dimensionare la stringa. Tuttavia, il rettangolo di delimitazione effettivo restituito da questo metodo può essere maggiore dei vincoli se è necessario ulteriore spazio per il rendering dell'intera stringa. In genere, il renderer conserva il vincolo di larghezza e regola il vincolo di altezza secondo necessità.

Se si specifica un carattere fisso e uno spazio troppo piccolo, qualcosa deve dare. In questo caso, è lo spazio di delimitazione. Immagino che ti aspetti il ​​line wrapping. Una larghezza di 288 consente qualsiasi spazio accettabile?

+2

Questo è buono e buono, ma lo sto chiedendo di disegnare il testo in uno spazio largo 288 e alto 9999. Restituisce un valore di 416 di larghezza e 15 di altezza. È stato chiaramente dato spazio sufficiente per l'altezza. Voglio solo che la larghezza sia corretta e che mi restituisca l'altezza ma sembra che ci sia qualche problema lì. C'è qualcosa che rompe le righe che mi sto solo perdendo? – BrettS

+0

Le interruzioni di riga sono impostate su A capo automatico e Riflettore automatico su Fisso. – BrettS

+0

Cosa succede se lo chiedi di disegnare nello spazio specificato con 'drawInRect:'? –

1

So che questa è una vecchia domanda, ma ho trovato una soluzione alternativa al problema. al di sotto è il codice di esempio

1) In primo luogo creare una macro per l'altezza minima

#define MIN_HEIGHT 10.0f 

2) Dopo che l'uso di seguito il codice per dare ad altezza variabile in base al testo specificato. Ma per questo è necessario specificare il frame per UILabel O qualunque cosa si stia utilizzando per la visualizzazione del testo.

// 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

C'è un vero e proprio bug esiste ancora nel metodo "boundingRectWithSize", a volte dà larghezza sbagliato maggiore della larghezza limitata, ho risolto da questo lavoro intorno e ottenere l'altezza dell'etichetta dopo la "sizeToFit" metodo

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;