2011-11-19 16 views
18

ho bisogno di fare qualche allineamento speciale con un marchio.imposta il numero massimo di righe in uilabel

voglio che abbia da 1 a 3 linee, qualunque sia il contenuto. Attualmente sto facendo qualcosa di simile

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

che funziona grande se il testo non è troppo lungo. se la stringa è qualcosa come @"Hello World" l'UILabel è alta solo 14 punti, se è un po 'più lunga si espande.

ora voglio che il testo dovrebbe aggiungere è di default ... punti tripli se il testo è troppo lungo per tre linee, ma con l'impostazione sulla parte superiore si espande per la quarta linea.

qualcuno ha un'idea di come ottenere ciò?

Si prega di lasciare un commento se qualcosa non è chiaro.

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

risposta

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

funziona come previsto. cambiato i limiti per inquadrare e cambiare la modalità di freno di linea. ha fatto una categoria fuori di esso, check out: https://github.com/martinjuhasz/UILabel-maximumNumberOfLines – choise

+0

'UILineBreakModeWordWrap' è stato deprecato. Utilizzare invece 'NSLineBreakByWordWrapping'. https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsparagraphstyle_Class/Reference/Reference.html – Chiubaka

13

Basta impostare label.numberOfLines = 3;.

È un po 'errato, in quanto contiene effettivamente la quantità massima di righe da visualizzare.

+0

Yup, e zero significa 'uso come molti come ti piace' – NJones

+0

se NumberOfLines non è zero, allora sizeToFit non funzionerà e ho bisogno il comportamento sizeToFit, perché non dovrebbe essere sempre tre linee alto se non ha bisogno di essere. – choise

+0

Ho frainteso la tua domanda quindi, mi spiace – Gil

0

Chiama getStringSize. Restituirà una variabile di tipo StringSize e deciderà in modo dinamico il numero di righe.

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

ho pensato di fare un tentativo:

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) 
} 

commenti sono certamente i benvenuti! Ho adottato questo da: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html

+0

Oh ... e mi rendo conto che questo potrebbe non rispondere alla sua domanda _specifically_, ma Potrebbe essere utile a chiunque la trovi. –

Problemi correlati