usa solo para numero llamadas emergencia descargar configurar bloqueado apple iphone layout text uilabel core-text

para - iphone bloqueado solo llamadas de emergencia



Escala de texto para caber en el iPhone (3)

Tengo problemas para encontrar la "mejor" manera de procesar texto en mi aplicación.

Mi vista principal consiste en una vista de texto, y el diseño de la aplicación dicta algunas cosas:

  • El tamaño (fuente) del texto debe ser dinámico
  • El marco de texto debe estar centrado verticalmente en la vista
  • La separación silábica debe ser automática y solo cuando sea necesario (evitada si es posible)

En este momento estoy usando un UILabel y el siguiente código para tratar de adivinar el mejor tamaño de fuente para usar para la cantidad de texto:

txt = @"this is just some sample text"; mylabel.font = [self getFontForString:txt]; mylabel.adjustsFontSizeToFitWidth = YES; mylabel.numberOfLines = 0; [mylabel setText:txt];

Y:

- (UIFont *) getFontForString:(NSString *)txt { CGFloat textLength = txt.length; CGFloat maxFontSize = 71; CGFloat minFontSize = 27; CGFloat newFontSize = 0; NSArray *chunks = [txt componentsSeparatedByString:@" "]; NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"length" ascending:NO] autorelease]; NSArray *sortedChunks = [chunks sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; CGSize labelSize = theThingLabel.bounds.size; CGSize projectedSize = [[sortedChunks objectAtIndex:0] sizeWithFont:[UIFont boldSystemFontOfSize:maxFontSize]]; if (projectedSize.width > labelSize.width) { CGFloat percentageDifference = ((projectedSize.width - labelSize.width)/labelSize.width)*100; if (percentageDifference > 50) { newFontSize = ((minFontSize/percentageDifference)*100) - 10; if (newFontSize < minFontSize) newFontSize = minFontSize; } else { newFontSize = ((percentageDifference/maxFontSize)*100) - 10; if(newFontSize < (maxFontSize/2)) newFontSize = maxFontSize - abs(newFontSize); } } else { if ( textLength > 11 && textLength < 255) { newFontSize = (maxFontSize - ((maxFontSize - minFontSize) * ((textLength- 11) / 100))); } else if (textLength <= 11) { newFontSize = maxFontSize; } else if (textLength >= 255) { newFontSize = minFontSize; } } return [UIFont boldSystemFontOfSize:newFontSize]; }

Esto funciona, hasta cierto punto, pero a menudo se cae cuando el texto es un poco largo, estos dos ejemplos lo muestran haciendo las siguientes cadenas:

  • "poca cantidad de texto"
  • "una cantidad de texto sustancialmente más larga que aún quiero renderizar muy bien".

Como puede ver en el segundo ejemplo (con texto mucho más largo), hay una serie de problemas:

  • La viuda inicial
  • La caída y
  • La falta "muy bien".

Entonces, teniendo en cuenta todo esto, ¿cuáles son mis opciones, estoy dispuesto a utilizar coretext si esta es la solución correcta, pero no tengo idea de por dónde empezar, también es posible que haya cometido un error que simplemente puedo '' Veo en mi código de "adivinación de tamaño de fuente".

Cualquier aportación que pueda ofrecer lo recibirá con gratitud.

¡Muchas gracias!


Una cosa que he encontrado útil es una pequeña función que toma un NSString, un UIFont y un CGSize, devolviendo un CGFloat que representa el tamaño de letra más grande para esa cadena que cabe en el CGSize pasado: usa sizeWithFont en tamaños de punto sucesivamente más pequeños hasta que tamaño devuelto encaja dentro del argumento CGSize. Puede pasar CGFLOAT_MAX como x o y si no le importa una dimensión, como cuando está revisando el ancho de una línea y verificará la altura más adelante en toda la cadena. Usted define los tamaños máximo y mínimo de fuente, por supuesto.

Comenzaría por separar la cadena en una matriz de palabras usando componentsSeparatedByString . Es posible que desee definir una palabra que se puede dividir en guiones como una palabra que es un múltiplo de la siguiente palabra más grande cuando todas las palabras se procesan con el mismo tamaño de fuente, por lo que crea esa matriz para un tamaño de letra arbitrario y tiene una matriz coincidente de anchos relativos (o tal vez un diccionario donde la palabra es la clave y el ancho del valor). Debe buscar y separar cualquier palabra (s) en dos palabras (una que contenga el guión) antes de continuar. A continuación, debe encontrar el tamaño de fuente en el que todas las palabras se ajustan a su restricción de tamaño, en el ejemplo que ha mostrado que es ancho, utilizando la función mencionada anteriormente.

Cuando se conoce el tamaño del tipo de letra candidato, verifique sus otras restricciones, como las viudas, probablemente las defina en términos de las posiciones en las que no pueden aparecer (el comienzo de una) y la proporción del ancho de línea que hace que una viuda. Si encuentra un problema, combine las palabras en la matriz para eliminar la viuda y recalcule un nuevo tamaño de letra candidato; esto podría hacer que finalice la separación silábica en la primera línea o una letra más pequeña en general, pero si el texto es "desproporcionadamente" comienza desde hace mucho tiempo a un grupo de pequeñas palabras "entonces quizás no tengas otra opción.

El problema de la "buena" desaparición no es tan difícil, solo debe verificar la altura del texto prestado; probablemente podría usar sizeWithFont:constrainedToSize una vez que haya completado los procedimientos anteriores como su última comprobación. Si falla, reduzca el tamaño de fuente candidato máximo y comience nuevamente.

Asi que:

candidateFontSize = CGFLOAT_MAX; while(stillRendering) break string into array of words make array of word widths check for and divide hyphenation candidates for each word if max font size returned for rendered word in size constraint < canddiateFontSize candidateFontSize = max font size returned for each word measure each word and record rendered size in candidateFontSize stillRendering = NO; for each word check each word for problems such as widows and solve if problem found stillRendering = YES; check entire string using sizeWithFont:constrainedToSize using width, CGFLOAT_MAX if height is too large stillRendering = YES; candidateFontSize--;

Es solo un comienzo, pero debería ser viable desde allí.


CGSize expectedLabelSize = [yourString sizeWithFont:yourLable.font]; //adjust the label the the new height. CGRect newFrame = yourLable.frame; newFrame.size.width = expectedLabelSize.width; newFrame.origin.x = x; yourLable.frame = newFrame;


El siguiente método se utilizará por completo para obtener el tamaño de fuente de una cadena específica para un rectángulo (área) específico.

-(float) maxFontSizeThatFitsForString:(NSString*)_string inRect:(CGRect)rect withFont:(NSString *)fontName onDevice:(int)device { // this is the maximum size font that will fit on the device float _fontSize = maxFontSize; float widthTweak; // how much to change the font each iteration. smaller // numbers will come closer to an exact match at the // expense of increasing the number of iterations. float fontDelta = 2.0; // sometimes sizeWithFont will break up a word // if the tweak is not applied. also note that // this should probably take into account the // font being used -- some fonts work better // than others using sizeWithFont. if(device == IPAD) widthTweak = 0.2; else widthTweak = 0.2; CGSize tallerSize = CGSizeMake(rect.size.width-(rect.size.width*widthTweak), 100000); CGSize stringSize = CGSizeZero; if([[UIDevice currentDevice].systemVersion floatValue]>=7.0){ NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont boldSystemFontOfSize:17] forKey: NSFontAttributeName]; stringSize = [_string boundingRectWithSize: tallerSize options:NSStringDrawingUsesLineFragmentOrigin attributes:stringAttributes context:nil].size; } else{ stringSize = [_string sizeWithFont:[UIFont fontWithName:fontName size:_fontSize] constrainedToSize:tallerSize]; } while (stringSize.height >= rect.size.height) { _fontSize -= fontDelta; stringSize = [_string sizeWithFont:[UIFont fontWithName:fontName size:_fontSize] constrainedToSize:tallerSize]; } return _fontSize; }

Use esto y obtenga el tamaño de fuente y asigne a la etiqueta.

Saludos,

Satya.