2011-01-11 17 views
7

Penso di aver trovato un caso limite per sizeWithFont: constrainedToSize: dove, su una retina display, a volte (sembra basato su word wrapping) restituisce una linea in altezza 1 più alto di quanto sia effettivamente necessario, e ancora più importante di quanto non sia effettivamente disegnato.NSString sizeWithFont: constrainedToSize: restituisce un'altezza errata sui display retina

NOTA: il codice reale che sto usando è sepolto all'interno di un codice di cella di tabella di altezza variabile disegnato con alte prestazioni, quindi ho distillato il problema con un codice di esempio il più semplice possibile. (Si prega di prendere nota di questo quando si cerca di rispondere a qualcosa di diverso dalla mia domanda :-)

Questo esempio UIView riempie il suo contenuto, misura il testo per adattarlo (avvolto), riempie quel rettangolo, quindi disegna il testo.

Su un dispositivo di retina (o simulatore) l'altezza viene restituita 1 riga troppo alta, ma su un dispositivo di pre-retina (o simulatore) restituisce l'altezza corretta.

Apprezzerei molto qualsiasi suggerimento che chiunque possa avere, in quanto è un bug che mi piacerebbe risolvere!

Grazie mille!

-Eric

- (void)drawRect:(CGRect)rect { 
NSString * theString = @"Lorem ipsum dolor sit ameyyet, consectetur adipiscing elit. Etiam vel justo leo. Curabitur porta, elit vel."; 
UIFont * theFont = [UIFont systemFontOfSize:12]; 
CGSize theConstraint = CGSizeMake(rect.size.width - 20, rect.size.height - 20); 
CGSize theResultSize = [theString sizeWithFont:theFont constrainedToSize:theConstraint]; 

// dump the measurements 
NSLog(@"returned a size h = %f, w = %f", theResultSize.height, theResultSize.width); 

// fill the whole rect 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[[UIColor yellowColor] set]; 
CGContextFillRect(context, rect); 

// fill the measured rect 
CGRect theRect = CGRectMake(10, 10, theResultSize.width, theResultSize.height); 
context = UIGraphicsGetCurrentContext(); 
[[UIColor cyanColor] set]; 
CGContextFillRect(context, theRect); 

// draw the text 
[[UIColor blackColor] set]; 
[theString drawInRect:theRect withFont:theFont]; 
} 

L'intero progetto semplice è disponibile here.

Immagini Simulator:
http://files.droplr.com/files/9979822/aLDJ.Screen%20shot%202011-01-11%20at%2012%3A34%3A34.png http://files.droplr.com/files/9979822/YpCM.Screen%20shot%202011-01-11%20at%2012%3A36%3A47.png

+0

dura, giusto? Qualcuno può aiutare? Il badge Tumbleweed non è stato molto divertente da guadagnare! – eric

+2

Dopo aver eseguito il tuo progetto di esempio, credo che fosse un simulatore o un bug dell'SDK, sì, non ha alcun problema su Xcode 4 con iOS 4.3. – cxa

+0

Grazie xan. Ora funziona come dovrebbe nell'attuale Xcode/iOS – eric

risposta

2

Sembra essere un problema con il simulatore. Questo è ciò che ho avuto quando mi sono imbattuto con un simulatore di Retina su OS 4.3.2

enter image description here

+0

Grazie per averlo visto. Dovrò attivarlo, e vedere se lo sta ancora facendo sugli attuali sistemi operativi. – eric

+1

Hai ragione, è stato corretto nel nuovo OS/Xcode. +1 per aver effettivamente eseguito il mio campione vs. dicendomi come misurare il testo ;-) grazie Sum! – eric

+0

Bene .. Ho appena avuto lo stesso bug in iOS8 ... È ora di iniziare a prestare attenzione ad esso. Questa volta sta accadendo SU DISPOSITIVO !! – eric

1

seguito è il metodo che uso per trovare l'altezza di etichetta per il contenuto del testo dinamico. Questo funziona bene nella mia app

 
 
- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel 
{ 
    UITextView *aSampleTextView; 
    // 30 is the minimum height 
    aSampleTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, mywidth, 30)]; 
    aSampleTextView.text = stringForTheLabel; 
    aSampleTextView.font = [UIFont systemFontOfSize:kMyFontSize]; 
    aSampleTextView.alpha = 0; 
    [self.view addSubview:aSampleTextView]; 
    float textViewHeight = aSampleTextView.contentSize.height; 
    [aSampleTextView removeFromSuperview]; 
    [aSampleTextView release]; 
    return textViewHeight;
}

+0

Idea interessante ... costoso come lo è ... dovrò dare un nuovo sguardo ... un anno dopo ... :-) – eric

+0

Prima di usare questo metodo, ho appena provato (CGSize theResultSize = [theString sizeWithFont : theFont constrainedToSize: theConstraint]; ) Ma non era molto preciso (non so perché). Anche se questo metodo consuma poco l'utilizzo della memoria, funziona bene per me. –

0
 NSString *strSubstring = @"asdfghjklasdfghjkl adsds"; 

     CGFloat maxWidth = 205.0; 
     CGFloat maxHeight = 9999; 
     CGSize maximumLabelSize = CGSizeMake(maxWidth,maxHeight); 
     CGSize expectedLabelSize = [strSubstring sizeWithFont:[UIFont fontWithName:@"StagSans-Light" size:12] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; 

     NSLog(@"returned a size h = %f, w = %f", expectedLabelSize.height, expectedLabelSize.width); 

     return expectedLabelSize; 
Problemi correlati