2013-04-12 14 views
10

Obecnie używamJak uzyskać rozmiar NSString, gdy NSString zawiera emotikony?

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

aby uzyskać rozmiaru NSString. Jednak gdy ten ciąg zawiera emotikony, wydaje się, że oblicza on rozmiar literalnego znaku Unicode, zamiast brać pod uwagę rozmiar samego emoji, powodując, że zwracany rozmiar jest nieprawidłowy.

Jak poprawnie uzyskać rozmiar napisu ze znakami emoji, tak jak będzie wyglądał uilabel?

+2

Być może można podać konkretny (krótki) przykład ciągu, obliczony rozmiar i oczekiwany rozmiar. –

+1

Po prostu próbowałem z mieszanką różnych znaków emoji i alfabetu łacińskiego, różnych czcionek, a rozmiar jest zawsze poprawny ... Być może problem dotyczy parametru 'constrainedToSize:', który jest zbyt mały, aby pomieścić ciąg znaków. – Guillaume

+1

Domyślnie wszystkie emoji są wyświetlane w ustalonym rozmiarze, niezależnie od rozmiaru czcionki, a zarówno NSString, jak i UIFont zignorują całkowicie rozmiar czcionki. Uważam, że znaki emoji są zawsze rysowane na poziomie około 20 pikseli (nie-siatkówki) w systemie iOS, więc nie będą prawidłowo mierzone z pozostałymi ciągami znaków. –

Odpowiedz

2

NSString nie przedstawia emoji, reprezentuje ciąg znaków, więc sizeWithFont będzie uwzględniać tylko ciąg znaków.

użyłbym:

CGRect labelFrame = label.frame; 
labelFrame.size = [label sizeThatFits:CGSizeMake(100, 9999)]; 
[label setFrame:labelFrame]; 

lub

//Alternatively 
[label sizeToFit]; 

mieć na uwadze, że sizeToFit wywołuje metodę sizeThatFits:, więc jeśli chodzi o po prostu ustawienie etykietę do właściwej wysokości, sizeThatFits: jest szybciej i o wiele łatwiej na oku.

+1

Przykro mi to rozczarować, ale przekonasz się, że to nie rozwiąże problemu, jak zauważyłem w moim stosie tutaj: http: // stackoverflow. com/questions/19537354/emojis-messing-with-obj-cs-sizewithfont-mat –

1

Przez pewien czas zmagałem się z tym samym, próbując wielu rozwiązań, w tym zaakceptowanej odpowiedzi, która nie działała dla mnie. Rozwiązałem to, tworząc ciąg NSAttributed z tekstem, a następnie używając metody NSAttributedString boundingRectWithSize: options: context:, aby uzyskać rozmiar ciągu.

NSString *text = //some text 
CGFloat maxSize = //text size constraints 

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text 
                     attributes:@{NSFontAttributeName : font 
                        }]; 

CGRect boundingRect = [attributedString boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil]; 
CGSize fitSize = boundingRect.size;