2017-04-12 1 views
0

J'ai examiné plusieurs questions Stackoverflow où les gens ont des problèmes avec boundingRectWithSize, mais aucun d'eux n'est vraiment mon problème.boundingRectWithSize retourne parfois une hauteur qui est d'environ 1 ligne trop grande

Le code suivant calcule souvent une hauteur de 1 ligne de texte trop grande.

CGFloat height = [label.attributedText 
    boundingRectWithSize:CGSizeMake(label.width, CGFLOAT_MAX) 
    options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
    context:nil].size.height; 

Par exemple, la chaîne Type de carte USGS Topo est à peu près la moitié de la largeur de mon point de vue et devrait être de 1 ligne haute (~ 18 pixels), mais finit par avoir une hauteur de 2 lignes (~ 36 pixels):

J'ai aussi essayé le calcul de la hauteur à l'aide du NSString au lieu de NSAttributedString, mais la même chose:

CGFloat height = [[label.attributedText string] 
    boundingRectWithSize:CGSizeMake(label.width, CGFLOAT_MAX) 
    options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
    attributes:@{NSFontAttributeName:TITLE_FONT} 
    context:nil].size.height; 

Vous pouvez voir dans cette capture d'écran que les 3 étiquettes en bas finissent taille correctement , mais pas les deux premiers. Je me suis tourné sur les étiquettes de couleurs mélangées dans le simulateur iOS de sorte que les sous-vues seront colorés pour illustrer:

enter image description here

+0

Pas certain que c'est la cause, mais notez que les deux chaînes supérieures comprennent des caractères qui sont dessinés en dessous de la ligne de base ('p' et' y' dans la chaîne supérieure, '(' et ')' dans le suivant) tandis que les trois autres ne le font pas. – ravron

+0

@ravron Ouais, j'avais remarqué cela aussi, mais j'ai essayé de changer les caractères en-dessous de la ligne de base et j'ai eu le même résultat. –

+0

Le problème persiste-t-il avec une police standard? J'ai eu des problèmes avec les polices qui ont des valeurs bancales qui ne sont pas évidentes en les regardant. – ravron

Répondre

2

Vous avez probablement une nouvelle ligne de fin dans votre chaîne. Essayez de le rogner avec whitespaceAndNewlineCharacterSet.

0

J'ai eu quelque chose de semblable arrive à moi il y a quelque temps, mais il n'a pas été avec une chaîne attribuée. Quand cela m'est arrivé, le cadre de l'étiquette n'était pas encore complètement réglé et donc, au moment du calcul, la largeur était suffisamment étroite pour qu'elle soit enroulée à la ligne suivante. Vérifiez le cadre de votre étiquette lorsque vous faites ce calcul et assurez-vous qu'il est aussi large que vous le pensez.