2011-11-19 24 views
18

necesito hacer una alineación especial con un uilabel.establecer el número máximo de líneas en uilabel

Quiero que tenga de 1 a 3 líneas, independientemente del contenido que tenga. actualmente lo estoy haciendo algo como esto

label.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:14.0f]; 
label.backgroundColor = [UIColor clearColor]; 
label.numberOfLines = 0; 
label.lineBreakMode = UILineBreakModeWordWrap; 

label.frame = CGRectMake(114.0f, 88.0f, 187.0f, 0.0f); 
[label sizeToFit]; 

la que funciona muy bien si el texto no es demasiado largo. si la cadena es algo así como @"Hello World", el UILabel tiene solo 14 puntos de alto, si es de alguna manera más largo se expande.

ahora quiero que el texto agregue ... puntos triples predeterminados si el texto es demasiado largo para tres líneas, pero con el ajuste en la parte superior se expande a la cuarta línea.

¿Alguien tiene una idea de cómo lograr esto?

Por favor deje un comentario si algo no está claro.

Editar:
check out this sample application to view my problem (hopefully).

Respuesta

18
label.numberOfLines = 3; 
CGSize size = [label.text sizeWithFont:label.font 
        constrainedToSize:CGSizeMake(SOME_WIDTH, 
                3 * label.font.lineHeight) 
         lineBreakMode:UILineBreakModeWordWrap]; 
label.bounds = CGRectMake(0, 0, 
          size.width, 
          size.height); 
+0

funciona como se esperaba. cambió los límites al cuadro y cambió el modo de freno de línea. hizo una categoría, consulte: https://github.com/martinjuhasz/UILabel-maximumNumberOfLines – choise

+0

'UILineBreakModeWordWrap' ha quedado en desuso. Use 'NSLineBreakByWordWrapping' en su lugar. https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsparagraphstyle_Class/Reference/Reference.html – Chiubaka

13

Sólo tienes que configurar label.numberOfLines = 3;.

Está mal etiquetado, ya que en realidad contiene la cantidad máxima de líneas para mostrar.

+0

Sí, y cero significa 'uso tanto como te gusta' – NJones

+0

si numberOfLines no es cero, entonces sizeToFit no va a funcionar y necesito el comportamiento sizeToFit, ya que no siempre debe ser de tres líneas alto si no es necesario. – choise

+0

No entendí bien su pregunta, lo siento – Gil

0

Llamada getStringSize. Devolverá una variable de tipo StringSize y decidirá dinámicamente el número de líneas.

struct StringSize { 

    int numberOfLine; 
    float height; 
    float width; 

}; 

typedef struct StringSize StringSize; 



+(StringSize)getStringSize:(NSString *)string ofWidth:(float)width FontSize:(id)font { 

    StringSize sizeForString; 

    if(string){ 
     CGSize size = CGSizeMake(width, 400.0f); 
     CGSize appStringSize = [string sizeWithFont:(UIFont *)font constrainedToSize:size  lineBreakMode:UILineBreakModeTailTruncation]; 
     CGSize sizeString = [string sizeWithFont:font];  

     sizeForString.width = appStringSize.width; 
     sizeForString.height = appStringSize.height; 
     sizeForString.numberOfLine = (int)(sizeForString.height/sizeString.height); 
    }else { 
     sizeForString.width = 0; 
     sizeForString.height = 0; 
     sizeForString.numberOfLine = 0; 
    } 

    return sizeForString; 
} 
2

pensé que iba a darle una oportunidad:

func heightForStringDrawing(myString: String, myFont:UIFont, myWidth:CGFloat) -> (CGFloat, Int) { 
    var tc = NSTextContainer(size: CGSize(width: myWidth, height:CGFloat(FLT_MAX))) 
    var ts = NSTextStorage(string: myString) 
    var lm = NSLayoutManager() 
    lm.addTextContainer(tc) 
    ts.addLayoutManager(lm) 
    ts.addAttribute(NSFontAttributeName, value: myFont, range: NSMakeRange(0, ts.length)) 
    tc.lineFragmentPadding = 0.0 
    lm.glyphRangeForTextContainer(tc) 
    let height = lm.usedRectForTextContainer(tc).height 
    let lines = Int(Float(height/myFont.lineHeight)) 
    return (height, lines) 
} 

Los comentarios son bienvenidos, sin duda! Adopté esto desde: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html

+0

Oh ... y me doy cuenta de que es posible que esto no responda específicamente a su pregunta, pero Podría ser útil para quien lo encuentre. –

Cuestiones relacionadas