J'ai un UILabel
espace pour deux lignes de texte. Parfois, lorsque le texte est trop court, ce texte s'affiche au centre vertical de l'étiquette.
Comment aligner verticalement le texte pour qu'il soit toujours en haut de la UILabel
?
J'ai un UILabel
espace pour deux lignes de texte. Parfois, lorsque le texte est trop court, ce texte s'affiche au centre vertical de l'étiquette.
Comment aligner verticalement le texte pour qu'il soit toujours en haut de la UILabel
?
Il n'y a aucun moyen de définir l'alignement vertical sur a UILabel
, mais vous pouvez obtenir le même effet en modifiant le cadre de l'étiquette. J'ai fait mes étiquettes en orange pour que vous puissiez voir clairement ce qui se passe.
Voici le moyen rapide et facile de le faire:
[myLabel sizeToFit];
Si vous avez une étiquette avec un texte plus long qui fera plus d'une ligne, définissez numberOfLines
sur 0
(zéro ici signifie un nombre illimité de lignes).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
Version plus longue
Je vais créer mon étiquette en code afin que vous puissiez voir ce qui se passe. Vous pouvez également configurer la plupart de cela dans Interface Builder. Ma configuration est une application basée sur la vue avec une image d'arrière-plan que j'ai créée dans Photoshop pour afficher les marges (20 points). L'étiquette est d'une couleur orange attrayante pour que vous puissiez voir ce qui se passe avec les dimensions.
- (void)viewDidLoad
{
[super viewDidLoad];
// 20 point top and left margin. Sized to leave 20 pt at right.
CGRect labelFrame = CGRectMake(20, 20, 280, 150);
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
[myLabel setBackgroundColor:[UIColor orangeColor]];
NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
[myLabel setText:labelText];
// Tell the label to use an unlimited number of lines
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
[self.view addSubview:myLabel];
}
Certaines limites d'utilisation sizeToFit
entrent en jeu avec le texte aligné au centre ou à droite. Voici ce qui se passe:
// myLabel.textAlignment = NSTextAlignmentRight;
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
L'étiquette est toujours dimensionnée avec un coin supérieur gauche fixe. Vous pouvez enregistrer la largeur de l'étiquette d'origine dans une variable et la définir après sizeToFit
, ou lui donner une largeur fixe pour contrer ces problèmes:
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
CGRect myFrame = myLabel.frame;
// Resize the frame's width to 280 (320 - margins)
// width could also be myOriginalLabelFrame.size.width
myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
myLabel.frame = myFrame;
Notez que sizeToFit
cela respectera la largeur minimale de votre étiquette initiale. Si vous commencez avec une étiquette de 100 de large et que vous l'appelez sizeToFit
, cela vous donnera une étiquette (peut-être très grande) de 100 (ou un peu moins) de largeur. Vous souhaiterez peut-être définir votre étiquette à la largeur minimale souhaitée avant de redimensionner.
Quelques autres choses à noter:
Le lineBreakMode
respect dépend de la façon dont il est défini. NSLineBreakByTruncatingTail
(par défaut) est ignoré après sizeToFit
, de même que les deux autres modes de troncature (tête et milieu). NSLineBreakByClipping
est également ignoré. NSLineBreakByCharWrapping
fonctionne comme d'habitude. La largeur du cadre est toujours réduite pour s'adapter à la lettre la plus à droite.
Mark Amery a donné un correctif pour les NIB et les storyboards utilisant la disposition automatique dans les commentaires:
Si votre étiquette est incluse dans une plume ou un storyboard en tant que sous-vue d'
view
un ViewController qui utilise la mise en page automatique, alors placer votresizeToFit
appelviewDidLoad
ne fonctionnera pas, car la mise en page automatique taille et positionne les sous-vues aprèsviewDidLoad
est appelée et annulera immédiatement les effets de votresizeToFit
appel. Toutefois, l' appelsizeToFit
de l' intérieurviewDidLayoutSubviews
volonté travail.
Cela utilise la NSString
méthode sizeWithFont:constrainedToSize:lineBreakMode:
pour calculer la hauteur du cadre nécessaire pour s'adapter à une chaîne, puis définit l'origine et la largeur.
Redimensionnez le cadre de l'étiquette en utilisant le texte que vous souhaitez insérer. De cette façon, vous pouvez accueillir n'importe quel nombre de lignes.
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont
constrainedToSize:maximumSize
lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;
adjustsFontSizeToFitWidth
utilisez alors sizeToFit, puis définissez le cadre de l'étiquette sur 0, 0, theWidthYouWant, label.frame.size.height (qui est la nouvelle hauteur déterminée par sizeToFit) ALORS appliqueradjustsFontSizeToFitWidth
Définissez le nouveau texte:
Réglez les
maximum number
lignes sur 0 (automatique):Réglez le cadre de l'étiquette à la taille maximale:
Appelez
sizeToFit
pour réduire la taille du cadre afin que le contenu corresponde:Le cadre des étiquettes est maintenant juste assez haut et large pour s'adapter à votre texte. Le coin supérieur gauche doit rester inchangé. J'ai testé cela uniquement avec le texte aligné en haut à gauche. Pour les autres alignements, vous devrez peut-être modifier le cadre par la suite.
En outre, mon étiquette a activé l'habillage de mots.
la source
En référence à la solution d'extension:
devrait être remplacé par
Un espace supplémentaire est nécessaire dans chaque nouvelle ligne ajoutée, car
UILabels
les retours de chariot de l' iPhone semblent être ignorés :(De même, alignBottom doit également être mis à jour avec un
@" \n@%"
à la place de"\n@%"
(pour l'initialisation du cycle doit être remplacé par "for (int i = 0 ..." aussi).L'extension suivante fonctionne pour moi:
Appelez ensuite
[yourLabel alignTop];
ou[yourLabel alignBottom];
après chaque affectation de texte yourLabel.la source
VerticalAlign
entre parenthèses après@implementation UILabel
. Étant nouveau dans Objective-C, je n'avais jamais rencontré cette syntaxe auparavant. Comment ça s'appelle?sizeWithFont:constrainedToSize:lineBreakMode:
et sizeWithFont: sont toutes deux dépréciées dans iOS7. En outre, cette catégorie ne fonctionne que sur les étiquettes lorsque numberOfLines est supérieur à 0.Juste au cas où cela aiderait quelqu'un, j'ai eu le même problème mais j'ai pu résoudre le problème simplement en passant de l'utilisation
UILabel
à l'utilisationUITextView
. J'apprécie que ce n'est pas pour tout le monde car la fonctionnalité est un peu différente.Si vous passez à l'utilisation
UITextView
, vous pouvez désactiver toutes les propriétés de la vue de défilement ainsi que l'interaction utilisateur activée ... Cela l'obligera à agir davantage comme une étiquette.la source
UITextView
m'a donné le résultat souhaité tout de suite.Pas de bruit, pas de bruit
Pas de bruit, pas d'Objective-c, pas de bruit mais Swift 3:
Swift 4.2
la source
Comme la réponse ci-dessus, mais ce n'était pas tout à fait correct, ou facile à insérer dans le code, donc je l'ai nettoyé un peu. Ajoutez cette extension à ses propres fichiers .h et .m ou collez-la juste au-dessus de l'implémentation que vous souhaitez utiliser:
Et puis pour utiliser, mettez votre texte dans l'étiquette, puis appelez la méthode appropriée pour l'aligner:
ou
la source
Un moyen encore plus rapide (et plus sale) d'accomplir cela est de définir le mode de saut de ligne de l'UILabel sur "Clip" et d'ajouter une quantité fixe de nouvelles lignes.
Cette solution ne fonctionnera pas pour tout le monde - en particulier, si vous souhaitez toujours afficher "..." à la fin de votre chaîne si elle dépasse le nombre de lignes que vous affichez, vous devrez utiliser l'une des les morceaux de code les plus longs - mais pour de nombreux cas, cela vous fournira ce dont vous avez besoin.
la source
UILineBreakModeWordWrap
plutôt.Approche la plus simple avec Storyboard:
Incorporez une étiquette dans StackView et définissez les deux attributs suivants de StackView dans l'inspecteur d'attributs:
1-
Axis
àHorizontal
,2-
Alignment
àTop
la source
UILabel
dans uneUIView
sous-classe (UIView
ordinaire suffit généralement) et laisser cette étiquette se développer dans le sens descendant. Merci!UILabel
et laisser le StackView faire son travail. Merci!Au lieu de
UILabel
vous pouvez utiliserUITextField
ce qui a l'option d'alignement vertical:la source
Je lutte depuis longtemps avec celui-ci et je voulais partager ma solution.
Cela vous donnera un
UILabel
texte qui rétrécira automatiquement jusqu'à 0,5 échelle et centrera verticalement le texte. Ces options sont également disponibles dans Storyboard / IB.la source
Créer une nouvelle classe
LabelTopAlign
fichier .h
fichier .m
Éditer
Voici une implémentation plus simple qui fait de même:
la source
sizeToFit
solutions ce qui rend en fait laUILabel
mettre tout texte en haut, même si vous remplacez dynamiquement un texte plus court avec une plus ou vice versa.Dans Interface Builder
UILabel
à la taille du plus grand texte possibleLines
sur «0» dans l'inspecteur d'attributsDans votre code
sizeToFit
sur votre étiquetteExtrait de code:
la source
Pour l'interface utilisateur adaptative (iOS8 ou version ultérieure), l'alignement vertical de UILabel doit être défini à partir de StoryBoard en modifiant les propriétés
noOfLines
= 0 etÉdité:
et les contraintes suivantes sont suffisantes pour obtenir les résultats souhaités.
la source
Créez une sous-classe de UILabel. Fonctionne comme un charme:
Comme discuté ici .
la source
J'ai écrit une fonction util pour atteindre cet objectif. Vous pouvez jeter un œil:
.Comment utiliser? (Si lblHello est créé par le générateur d'interface, je saute donc certains détails des attributs UILabel)
Je l'ai également écrit sur mon blog en tant qu'article : http://fstoke.me/blog/?p=2819
la source
J'ai pris un certain temps pour lire le code, ainsi que le code de la page introduite, et j'ai constaté qu'ils essayaient tous de modifier la taille du cadre de l'étiquette, afin que l'alignement vertical central par défaut n'apparaisse pas.
Cependant, dans certains cas, nous voulons que l'étiquette occupe tous ces espaces, même si l'étiquette contient beaucoup de texte (par exemple, plusieurs lignes de même hauteur).
Ici, j'ai utilisé une autre façon de le résoudre, en remplissant simplement les sauts de ligne jusqu'à la fin de l'étiquette (veuillez noter que j'ai hérité de la
UILabel
, mais ce n'est pas nécessaire):la source
Ce que j'ai fait dans mon application était de définir la propriété de ligne de l'UILabel sur 0 ainsi que de créer une contrainte inférieure de l'UILabel et de s'assurer qu'elle est définie sur> = 0, comme indiqué dans l'image ci-dessous.
la source
J'ai pris les suggestions ici et créé une vue qui peut envelopper un UILabel et le dimensionner et définir le nombre de lignes afin qu'il soit aligné en haut. Mettez simplement un UILabel comme sous-vue:
la source
Vous pouvez utiliser TTTAttributedLabel , il prend en charge l'alignement vertical.
la source
J'ai trouvé que les réponses à cette question sont maintenant un peu obsolètes, alors ajoutez cela pour les fans de mise en page automatique.
La mise en page automatique rend ce problème assez trivial. En supposant que nous ajoutons l'étiquette à
UIView *view
, le code suivant accomplira cela:La hauteur de l'étiquette sera calculée automatiquement (en l'utilisant
intrinsicContentSize
) et l'étiquette sera positionnée bord à bord horizontalement, en haut de laview
.la source
J'ai utilisé beaucoup des méthodes ci-dessus, et je veux juste ajouter une approche rapide et sale que j'ai utilisée:
Assurez-vous que le nombre de sauts de ligne dans la chaîne entraînera tout texte à remplir l'espace vertical disponible et définissez le UILabel pour tronquer tout texte débordant.
Parce que parfois assez bon est assez bon .
la source
UITextView
c'est qu'il peut appelerdlopen
afin de prendre en charge la saisie de texte. Cela peut entraîner un retard important sur le thread d'interface utilisateur, donc cette approche est beaucoup plus performante!Je voulais avoir une étiquette capable d'avoir plusieurs lignes, une taille de police minimale et centrée horizontalement et verticalement dans sa vue parent. J'ai ajouté mon étiquette par programme à ma vue:
Et puis quand j'ai voulu changer le texte de mon étiquette ...
J'espère que cela aide quelqu'un!
la source
FXLabel (sur github) le fait hors de la boîte en définissant
label.contentMode
surUIViewContentModeTop
. Ce composant n'est pas fait par moi, mais c'est un composant que j'utilise fréquemment et qui a des tonnes de fonctionnalités, et semble bien fonctionner.la source
pour quiconque lit ceci parce que le texte à l'intérieur de votre étiquette n'est pas centré verticalement, gardez à l'esprit que certains types de polices ne sont pas conçus de la même manière. par exemple, si vous créez une étiquette de taille zapfino 16, vous verrez que le texte n'est pas parfaitement centré verticalement.
cependant, travailler avec helvetica centrera verticalement votre texte.
la source
Utilisez
textRect(forBounds:limitedToNumberOfLines:)
.la source
Sous-classe UILabel et contraignez le rectangle de dessin, comme ceci:
J'ai essayé la solution impliquant un remplissage de nouvelle ligne et j'ai rencontré un comportement incorrect dans certains cas. D'après mon expérience, il est plus facile de contraindre le rect rectangle comme ci-dessus que de jouer avec
numberOfLines
.PS Vous pouvez imaginer facilement supporter UIViewContentMode de cette façon:
la source
Si vous utilisez la mise en page automatique, définissez le contentHuggingPriority vertical sur 1000, soit en code, soit en IB. Dans IB, vous devrez peut-être supprimer une contrainte de hauteur en définissant sa priorité sur 1, puis en la supprimant.
la source
Tant que vous n'effectuez aucune tâche complexe, vous pouvez utiliser à la
UITextView
place deUILabels
.Désactivez le défilement.
Si vous voulez que le texte soit affiché complètement juste l'utilisateur
sizeToFit
et lessizeThatFits:
méthodesla source
En bref,
let myLabel : UILabel!
Pour que votre texte de votre étiquette s'adapte à l'écran et qu'il se trouve en haut
myLabel.sizeToFit()
Pour que votre police d'étiquette s'adapte à la largeur de l'écran ou à une largeur spécifique.
myLabel.adjustsFontSizeToFitWidth = YES
et certains textAlignment pour l'étiquette:
myLabel.textAlignment = .center
myLabel.textAlignment = .left
myLabel.textAlignment = .right
myLabel.textAlignment = .Natural
myLabel.textAlignment = .Justified
la source
[myLabel sizeToFit]
. Je vous remercie!Ceci est une ancienne solution, utilisez la mise en page automatique sur iOS> = 6
Ma solution:
la source