2013-04-12 5 views
10

Attualmente sto usandoCome ottenere la dimensione NSString quando NSString include emoji?

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

per ottenere la dimensione di un NSString. Tuttavia, quando quella stringa include gli emoji, sembra calcolare la dimensione del carattere unicode letterale piuttosto che prendere in considerazione la dimensione dell'emoji stessa, rendendo errata la dimensione restituita.

Come faccio ad ottenere correttamente la dimensione della stringa con caratteri emoji, come apparirà in un marchio?

+2

Forse si potrebbe dare una concreta (breve) esempio di una stringa, la dimensione calcolata e la dimensione attesa. –

+1

Ho appena provato con un mix di diverse emoji e caratteri romani, diversi tipi di carattere e la dimensione è sempre corretta ... Forse il problema è con il parametro 'constrainedToSize:', che è troppo piccolo per contenere la stringa .. – Guillaume

+1

Per impostazione predefinita, tutte le emoji sono presentate con una dimensione fissa, indipendentemente dalla dimensione del carattere e sia NSString che UIFont ignoreranno completamente la dimensione del carattere. Credo che i personaggi delle emoji siano sempre disegnati a circa 20px (non retina) su iOS, quindi non verranno misurati correttamente con il resto della stringa. –

risposta

2

NSString non presenta l'emoji, rappresenta una stringa, quindi la dimensioneWithFont rappresenterà solo la stringa.

Userei:

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

o

//Alternatively 
[label sizeToFit]; 

Bare in mente che sizeToFit chiama il metodo sizeThatFits:, quindi in termini di sufficiente impostare l'etichetta alla giusta altezza, sizeThatFits: è più veloce e molto più facile per gli occhi.

+1

Mi dispiace deludere, ma scoprirai che questo non risolverà il problema, come notato nello stack qui: http: // stackoverflow. com/domande/19537354/emoji-Messing-con-obj-cs-sizewithfont-math –

1

Ho lottato con questa stessa cosa per un po ', tentando soluzioni multiple inclusa la risposta accettata, che non ha funzionato per me. Ho risolto questo problema creando una stringa NSAttribuita con il testo, quindi utilizzando il metodo NSAttributoString boundingRectWithSize: options: context: per ottenere la dimensione della stringa.

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;