2011-11-19 25 views
18

Potrzebuję zrobić specjalne wyrównanie z uilabel.ustaw maksymalną liczbę linii uilabel

Chcę mieć od 1 do 3 linii, niezależnie od zawartości. obecnie robię to coś jak ten

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

który działa świetnie, jeśli tekst nie jest zbyt długa. jeśli ciąg znaków jest podobny do @"Hello World", UILabel ma tylko 14 punktów, a jeśli jest dłuższy, to rozszerza się.

Teraz chcę, aby tekst został dodany domyślnie ... potrójne kropki, jeśli tekst jest zbyt długi na trzy linie, ale z ustawieniem u góry rozszerza się do czwartej linii.

Czy ktoś ma pomysł, jak to osiągnąć?

Proszę zostawić komentarz, jeśli coś nie jest jasne.

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

Odpowiedz

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

działa zgodnie z oczekiwaniami. zmienił granice na klatkę i zmienił tryb hamulca linii. zrobiła kategorię z tego, sprawdź: https://github.com/martinjuhasz/UILabel-maximumNumberOfLines – choise

+0

'UILineBreakModeWordWrap' jest przestarzałe. Zamiast tego użyj 'NSLineBreakByWordWrapping'. https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsparagraphstyle_Class/Reference/Reference.html – Chiubaka

13

Wystarczy ustawić label.numberOfLines = 3;.

To jest trochę błędne, ponieważ zawiera maksymalną liczbę linii do wyświetlenia.

+0

Tak, a zero oznacza „Użyj tyle ile chcesz” – NJones

+0

jeśli numberOfLines nie jest zero, to sizeToFit nie będzie działać i trzeba zachowanie sizeToFit, ponieważ nie zawsze powinny być trzy linie wysokie, jeśli nie musi być. – choise

+0

Źle zrozumiałem twoje pytanie, przepraszam – Gil

0

Zadzwoń pod getStringSize. Zwróci zmienną typu StringSize i zdecyduje dynamicznie liczbę linii.

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

myślałem, że chciałbym spróbować:

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

komentarze są oczywiście mile widziane! I przyjął to z: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html

+0

Och ... i zdaję sobie sprawę, że to może nie odpowiedzieć na jego pytanie, szczególnie, ale Może być przydatny dla każdego, kto się z nim spotka. –

Powiązane problemy