38 votes

Qu'est-ce que -[NSString sizeWithFont:forWidth:lineBreakMode:] bon?

Dans ma question "Comment puis-je obtenir de l' -[NSString sizeWithFont:forWidth:lineBreakMode:] de travail?", J'ai appris que le -[NSString sizeWithFont:constrainedToSize:lineBreakMode:] a été en fait ce dont j'avais besoin.

La documentation pour l' -[NSString sizeWithFont:forWidth:lineBreakMode:] unis explique qu'il n'a pas fait passer le texte à d'autres lignes. Alors, comment aurais-je l'utiliser? (Exemples de l'aide.)

66voto

PyjamaSam Points 7802

Il fonctionne très bien pour le multi en ligne de cordes aussi.

Fondamentalement, de son une fonction qui vous permet de voir comment grand d'une chaîne va être lors du rendu avec une police et une rupture de ligne de mode.

- Je l'utiliser dans quelques endroits dans ma demande, lorsque j'ai de longueur variable texte que je veux afficher dans un certain domaine.

Par défaut, un UILabel permettra de centrer le texte verticalement. Pour avoir le texte en haut aligné vous avez besoin de la taille de l'étiquette de n'être que la hauteur requise par la chaîne qui est en elle.

J'utilise cette méthode pour ce faire.

Et l'exemple de comment je pourrais l'utiliser pour faire comme suit:

//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Vous précisez la taille d'une région que vous avez à mettre le texte, puis cette méthode vous indique combien d'espace il va prendre (emballage, comme l'exige). Aussi, si la chaîne va déborder les limites de la rect vous fournir, vous pouvez dire et de décider comment pour afficher le texte.

La référence est-il réellement enveloppant le texte est là parce que cette méthode n'est pas réellement faire quelque chose pour le texte. Il vient pratiquement la pose et retourne quelle est la taille d'une zone dont il aurait besoin pour vraiment le mettre en page.

sa la responsabilité de l'étiquette (ou ce que jamais récipient que vous utilisez pour le texte) pour effectuer l'emballage/quoi d'autre qui doit être fait.

Espérons que cela aide.

chris.

25voto

Andrew Points 1099

Pendant un moment j'ai pensé que cette routine était tout simplement cassé. Il sonne comme il est parfait pour la routine de travail comment haut un morceau de texte est, quand enveloppé dans une certaine largeur. Cependant, ce n'est pas ce qu'il fait. En effet, la hauteur retournée est toujours une seule ligne. (Ce qui est inutile, d'ailleurs: UIFonts' -leading renvoie la même valeur.)

Pour citer la documentation au moment de l'écriture:

Bien qu'elle calcule où les sauts de ligne pourraient se produire, cette méthode ne permet pas réellement de faire passer le texte à d'autres lignes; [...]

Cette phrase me confond pour une longue période de temps. Mes pensées couraient le long des lignes de:

  • Le calcul des sauts de lignes, mais pas l'emballage. Hein???
  • Peut-être qu'ils signifient la réception d' NSString lui-même de ne pas être muté pour refléter des sauts de lignes? Mais je n'attends pas ça de toute façon?
  • Cette phrase n'est pas cohérente avec elle-même. Je n'ai pas le choix, mais de l'ignorer.

Cependant, il s'avère qu'il y est un sens qui correspond au comportement nous voir. Il semble que ce qu'ils veulent dire est:

Cette routine de calcul où le premier saut de ligne vont se produire, et tout le texte après c'est pris en compte pour le calcul de la boîte englobante.

La boîte englobante retourné aura donc la hauteur d'une ligne et d'une largeur allant jusqu'à la valeur maximale spécifiée. (La largeur peut être moins selon l'endroit où le saut de ligne est calculée, ou si le texte est assez court qu'il n'a pas besoin de la largeur maximale.)

Pour, euh, de répondre à la question: de Quoi est-il bon? Je n'ai pas trouvé quelque chose d'utile moi-même: seules choses où j'ai pensé qu'il serait utile, mais ne l'était pas. Quelques choses qui viennent à l'esprit, cependant, sont les suivants:

  • Centrage d'une seule ligne de texte. Je pense boutons et/ou des titres ici. (Bien qu' UILabel et UIButton pouvez le faire, vous pouvez dessiner vous-même).
  • Calculer les limites pour un "extrait" d'un plus long morceau de texte. Ici, je suis en train de réfléchir où vous pourriez montrer un extrait d'un plus grand morceau de texte.

2voto

Marc Charbonneau Points 30464

Il sonne comme il serait bon pour de simples étiquettes de ligne. Par exemple, si vous dessinez une chaîne de caractères qui peuvent être tronqués ou un saut de ligne, mais vous n'allez pas tirer plus d'une ligne. Il pourrait encore être utile à la connaissance exacte de la hauteur et la largeur de la chaîne, de sorte que vous pouvez les positionner exactement où vous le souhaitez (et attirer d'autres éléments de l'UI autour d'elle).

1voto

whyoz Points 1308

Voici quelque chose qui m'est venu après l'application de quelques principes de PyjamaSam de l'exemple:

AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
self.backgroundColor = [UIColor greenColor];
self.frame = CGRectMake(0,0,30,30);
imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
imageView.frame = CGRectMake(3,3,20,20);
imageView.layer.masksToBounds = NO;
[self addSubview:imageView];
[imageView release];

CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
CGRect newFrame = self.frame;
newFrame.size.height = titleSize.height + 12;
newFrame.size.width = titleSize.width + 32;
self.frame = newFrame;
self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
self.layer.borderWidth = 3.0;

UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
infoLabel.text = myAnnotation.title;
infoLabel.backgroundColor = [UIColor clearColor];
infoLabel.textColor = [UIColor blackColor];
infoLabel.textAlignment = UITextAlignmentCenter;
infoLabel.font = [UIFont systemFontOfSize:12];

[self addSubview:infoLabel];
[infoLabel release];

Dans cet exemple, je vais ajouter un code pin personnalisé pour un MKAnnotation classe qui redimensionne un UILabel en fonction de la taille du texte. Il ajoute également une image sur le côté gauche de la vue, de sorte que vous voyez une partie du code de la gestion de l'espacement approprié pour traiter l'image et le rembourrage.

La clé est d'utiliser CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; puis redéfinir la vue de ses dimensions. Vous pouvez appliquer cette logique à tout point de vue, mais il ne gère pas les retours à la ligne (comme le Pyjama de.

Bien que le Pyjama de la réponse qui fonctionne pour certains, cela n'a pas fonctionné pour moi. C'est une explication détaillée de ce que vous devriez essayer immédiatement avant d'aller ailleurs si vous voulez une dynamique personnalisé MKAnnotation pin avec une image et redimensionnable UILabel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X