Dans ma question " Comment puis-je obtenir -[NSString sizeWithFont:forWidth:lineBreakMode:]
pour travailler? ", j'ai appris que -[NSString sizeWithFont:constrainedToSize:lineBreakMode:]
était en fait ce dont j'avais besoin.
La documentation de -[NSString sizeWithFont:forWidth:lineBreakMode:]
indique qu'il n'encapsule pas réellement le texte sur des lignes supplémentaires. Alors, comment pourrais-je l'utiliser? (Des exemples pourraient aider.)
Cela fonctionne également très bien pour les chaînes multi-lignes.
Fondamentalement, c'est une fonction qui vous permet de voir la taille d'une chaîne lorsqu'elle sera rendue avec un mode de police et de saut de ligne.
Je l'utilise à quelques endroits de mon application lorsque j'ai du texte de longueur variable que je souhaite afficher dans une certaine zone.
Par défaut, un UILabel centrera le texte verticalement. Pour que le texte soit aligné en haut, vous devez redimensionner l'étiquette pour qu'elle ne soit que la hauteur requise par la chaîne qui s'y trouve.
J'utilise cette méthode pour ce faire.
Et un exemple de la façon dont je l'utiliserais pour le faire est le suivant:
//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 spécifiez la taille d'une zone dans laquelle vous devez placer le texte, puis cette méthode vous indique la quantité d'espace qu'elle prendra (habillage selon les besoins). De plus, si la chaîne va déborder les limites du rect que vous fournissez, vous pouvez dire et ensuite décider comment afficher le texte.
La référence au fait qu'il n'entoure pas réellement le texte est là parce que cette méthode ne fait rien au texte. Il le présente simplement et retourne la taille d'une zone dont il aurait vraiment besoin pour le disposer.
il est de la responsabilité de l'étiquette (ou du conteneur que vous utilisez pour le texte) d'exécuter l'emballage/de tout ce qui doit être fait.
J'espère que cela pourra aider.
chris.
Pendant un moment, j'ai pensé que cette routine était tout simplement brisée. Il semble que ce soit la routine parfaite pour déterminer comment élevé un morceau de texte est, lorsqu'il est enveloppé à une certaine largeur . Mais ce n'est pas ce qu'il fait. En effet, la hauteur renvoyée est toujours une seule ligne. (Ce qui est inutile, soit dit en passant: UIFont
's -leading
renvoie la même valeur.)
Pour citer la documentation au moment de la rédaction:
Bien qu'elle calcule où les sauts de ligne se produiraient, cette méthode n'encapsule pas réellement le texte sur des lignes supplémentaires; [...]
Cette phrase m'a longtemps troublé. Mes pensées allaient dans le sens de:
NSString
récepteur lui-même ne sera pas muté pour refléter les sauts de ligne? Mais je ne m'attends pas à ça de toute façon?Cependant, il s'avère qu'il y a une signification qui correspond au comportement que nous voyons. Il semble que ce qu'ils veulent dire soit:
Cette routine calculera où le premier saut de ligne se produira, et tout le texte après celui-ci sera ignoré aux fins du calcul de la boîte englobante.
La boîte englobante renvoyée aura donc la hauteur d'une seule ligne et une largeur jusqu'au maximum spécifié. (La largeur peut être inférieure selon l'endroit où le saut de ligne est calculé, ou si le texte est suffisamment court pour qu'il n'a pas besoin de la largeur maximale.)
Pour, euh, répondre à la vraie question: à quoi ça sert? Je n'ai rien trouvé d'utile moi-même: seulement des choses où je pensais que ce serait utile, mais pas. Cependant, certaines choses qui me viennent à l'esprit sont:
UILabel
et UIButton
puissent le faire, vous voulez parfois le dessiner vous-même.)Il semble que ce serait bon pour les étiquettes à une seule ligne. Par exemple, si vous dessinez une chaîne qui peut être tronquée ou avoir un saut de ligne, mais vous ne dessinerez pas plus d'une ligne. Il pourrait toujours être utile de connaître la hauteur et la largeur exactes de la chaîne, afin que vous puissiez la positionner exactement où vous le souhaitez (et dessiner d'autres éléments d'interface utilisateur autour d'elle).
Voici quelque chose que j'ai trouvé après avoir appliqué quelques principes de l'exemple de PyjamaSam:
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, j'ajoute une épingle personnalisée à une classe MKAnnotation 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 gérant l'espacement approprié pour gérer l'image et le remplissage.
La clé est d'utiliser CGSize titleSize = [myAnnotation.THETEXT sizeWithFont: [UIFont systemFontOfSize: 12]]; puis redéfinissez les dimensions de la vue. Vous pouvez appliquer cette logique à n'importe quelle vue, mais elle ne gère pas les sauts de ligne comme ceux de Pyjama.
Bien que la réponse de Pyjama fonctionne pour certains, cela n'a pas fonctionné pour moi. Il s'agit d'une explication détaillée que vous devez essayer immédiatement avant d'aller ailleurs si vous souhaitez une épingle MKAnnotation personnalisée dynamique avec une image et un UILabel redimensionnable.