2010-04-19 14 views
27

"Szybko": jak mogę uzyskać rozmiar (szerokość) NSString?Jak uzyskać rozmiar NSString

Próbuję sprawdzić, czy szerokość łańcucha napisu jest większa niż podana szerokość ekranu, przypadek, w którym muszę go "przyciąć" i dołączyć do "...", uzyskiwanie zwykłego zachowania UILabel. string.length nie zadziała, ponieważ AAAAAAAA i iiiiii mają tę samą długość, ale różne rozmiary (na przykład).

Trochę utknąłem.

Wielkie dzięki.

Odpowiedz

38

To jest inne podejście. Znajdź minimalny rozmiar tekstu, aby nie był zawijany do więcej niż jednej linii. Jeśli zawija się do jednej linii, możesz dowiedzieć się, używając wysokości.

Można użyć tego kodu:

CGSize maximumSize = CGSizeMake(300, 9999); 
NSString *myString = @"This is a long string which wraps"; 
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; 
CGSize myStringSize = [myString sizeWithFont:myFont 
          constrainedToSize:maximumSize 
           lineBreakMode:self.myLabel.lineBreakMode]; 

300 to szerokość ekranu z trochę miejsca na marginesach. Powinieneś zastąpić własne wartości dla czcionki i rozmiaru, a dla lineBreakMode, jeśli nie używasz IB.

Teraz myStringSize będzie zawierał height, który możesz sprawdzić na wysokości czegoś, co wiesz, że ma tylko 1 linię wysokości (używając tej samej czcionki i rozmiaru). Jeśli jest większy, musisz wyciąć tekst. Zauważ, że powinieneś dodać ciąg znaków do ciągu znaków, zanim go ponownie sprawdzisz (dodanie ... może spowodować ponowne przekroczenie limitu).

Umieść ten kod w pętli, aby wyciąć tekst, a następnie ponownie sprawdź poprawną wysokość.

+0

Wielkie dzięki! Twoja odpowiedź była prawidłowa, a sztuczka dodania "..." przed ponownym sprawdzeniem rozmiaru była rozsądna. – camilo

+5

Na iOS 7 powinieneś sprawdzić [tę odpowiedź] (http://stackoverflow.com/a/18951386/3965) –

+1

jest przestarzały po ios7, powinieneś użyć boundingRectWithSize: .. – 7heaven

4

Musisz użyć Core Graphics, aby zmierzyć ciąg, wyrenderowany w określonej czcionce i rozmiarze. Zobacz odpowiedzi do Measuring the pixel width of a string, aby zapoznać się z instrukcją.

+0

Odpowiedź nevy rozwiązała problem. dzięki mimo to. – camilo

10

Użyj poniższej metody.

Cel C

- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { 
    CGSize size = CGSizeZero; 
    if (text) { 
     CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil]; 
     size = CGSizeMake(frame.size.width, frame.size.height + 1); 
    } 
    return size; 
} 

Swift 3,0

func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize { 
    var size = CGSizeZero 
    if text { 
     var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 
     size = CGSize(width: frame.size.width, height: frame.size.height + 1) 
    } 
    return size 
} 
+0

Dlaczego wzrost + 1? –

+0

'size = CGSize (width: ceilf (frame.width), height: ceilf (frame.height))' jest lepsze. –

+0

Pytanie brzmi, jak uzyskać szerokość napisu.Ta odpowiedź brzmi: jak uzyskać wysokość napisu, jeśli znasz już jego szerokość ... dobra informacja, ale nie odpowiedź na pytanie. Myślę, że lepszym podejściem do zrobienia tej odpowiedzi jest postawienie właściwego pytania, a następnie samodzielna odpowiedź, a następnie ewentualny komentarz do tego pytania, który wskaże na powiązane pytanie. – mah

2
sizeWithFont:constrainedToSize:lineBreakMode 

jest przestarzała się. Użyj poniższego fragmentu kodu,

UIFont *font=[UIFont fontWithName:@"Arial" size:16.f]; 

NSString *name = @"APPLE"; 

CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];