2011-01-11 17 views
7

Creo que he encontrado una caja de borde para sizeWithFont: constrainedToSize: donde, en una pantalla de retina, a veces (parece basarse en el ajuste de palabra) devuelve una altura de 1 línea más alto de lo que realmente se necesita, y más importante aún de lo que realmente se dibuja.NSString sizeWithFont: constrainedToSize: devolver la altura incorrecta en retina muestra

NOTA: El código real que estoy utilizando está oculto dentro del código de celda de vista de tabla de altura variable dibujado a mano céntrico, así que he reducido el problema a un código de muestra tan simple como sea posible. (Por favor, tome nota de esto cuando intente responder algo que no sea mi pregunta :-)

Esta muestra UIView llena su contenido, mide el texto para ajustar (envuelto), rellena el rect y luego dibuja el texto.

En un dispositivo de retina (o simulador) la altura se devuelve 1 línea demasiado alta, pero en un dispositivo prerretina (o simulador) devuelve la altura correcta.

Agradecería mucho cualquier comentario que alguien pueda tener, ¡ya que es un error que me gustaría solucionar!

¡Muchísimas gracias!

-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]; 
} 

El proyecto simple conjunto está disponible here.

Imágenes 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

una pregunta difícil, ¿verdad? ¿Alguien puede ayudar? ¡La insignia Tumbleweed no fue muy divertida de ganar! – eric

+2

Después de ejecutar su proyecto de muestra, creo que fue un simulador o error de SDK, sí, no tiene ningún problema en el Xcode 4 con iOS 4.3. – cxa

+0

Gracias xan. Ahora está funcionando como debería en el actual Xcode/iOS – eric

Respuesta

2

Parece ser un problema con el simulador. Esto es lo que me dieron cuando me encontré con un simulador de retina en OS 4.3.2

enter image description here

+0

Gracias por mirarlo. Tendré que encender esto y ver si todavía está haciendo eso en el sistema operativo (s) actual. – eric

+1

Tiene razón, está corregido en el nuevo OS/Xcode. +1 por ejecutar realmente mi muestra versus decirme cómo medir el texto ;-) gracias Sum! – eric

+0

Bueno ... Acabo de presentar este mismo error en iOS8 ... Es hora de volver a prestarle atención. ¡Esta vez está sucediendo EN EL DISPOSITIVO! – eric

1

A continuación se presenta el método que utilizo para encontrar la altura de la etiqueta de contenido de texto dinámico. Esto funciona bien en mi aplicación

 
 
- (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 interesante ... tan costosa como ... Tengo que echar un vistazo fresco ... un año después ... :-) – eric

+0

Antes de usar este método, acabo de probar (CGSize theResultSize = [theString sizeWithFont] : theFont constrainedToSize: theConstraint]; ) Pero no era tan exacto (no sé por qué). Aunque este método consume poco uso de memoria, etc., funciona bien para mí. –

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; 
Cuestiones relacionadas