Comment le UILabel
peut être aligné à partir du bas. Disons que mon étiquette peut contenir trois lignes de texte.Si le texte d'entrée est une seule ligne, cette ligne devrait venir en bas de l'étiquette.Veuillez vous référer à l'image ci-dessous pour une meilleure compréhension. La zone orange est le cadre complet de l'étiquette. Actuellement, elle a une ligne et elle est alignée au centre. Donc, ce que je veux, c'est qu'il devrait toujours être aligné en bas, quel que soit le nombre de lignes.
Veuillez suggérer vos idées.
Je vous remercie.
Voici deux façons de le faire ...
1. Définissez d'abord numberOfLines
sur 0, puis utilisez sizeToFit
propriété de UILabel
pour que votre UILabel
s'affiche avec son contentSize
.
yourLabel.numberOfLines = 0;
[yourLabel sizeToFit];
Voir plus d'informations à partir de ce lien: Aligner verticalement le texte dans un UILabel
2. Une autre option consiste à prendre UITextField
au lieu de UILabel
et à définir userInteractionEnabled
sur NO
comme ci-dessous ...
[yourTextField setUserInteractionEnabled:NO];
puis définissez la propriété contentVerticalAlignment
en bas comme ci-dessous ...
[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[~ # ~] mise à jour [~ # ~]
De plus, avec UITextField
, nous ne pouvons pas obtenir plusieurs lignes. Donc, à la place, nous pouvons utiliser UITextView
et définir son userInteractionEnabled
sur NO
. Ensuite, utilisez le code ci-dessous pour l'aligner en bas.
CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height);
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
Sous-classe UILabel
@interface Label : UILabel
@end
Remplacez ensuite drawTextInRect comme ceci
@implementation Label
- (void)drawTextInRect:(CGRect)rect
{
if(alignment == top) {
rect.size.height = [self sizeThatFits:rect.size].height;
}
if(alignment == bottom) {
CGFloat height = [self sizeThatFits:rect.size].height;
rect.Origin.y += rect.size.height - height;
rect.size.height = height;
}
[super drawTextInRect:rect];
}
@end
Version Swift 4.2 utilisant la propriété contentMode
pour définir le haut et le bas:
class VerticalAlignedLabel: UILabel {
override func drawText(in rect: CGRect) {
var newRect = rect
switch contentMode {
case .top:
newRect.size.height = sizeThatFits(rect.size).height
case .bottom:
let height = sizeThatFits(rect.size).height
newRect.Origin.y += rect.size.height - height
newRect.size.height = height
default:
()
}
super.drawText(in: newRect)
}
}
Ensuite, configurez votre étiquette comme ça:
let label: VerticalAlignedLabel = UILabel()
label.contentMode = .bottom
je ne fixe qu'une contrainte inférieure à la super vue dans IB qui fonctionne pour moi sans utiliser de code ni de nombre de lignes pour une contrainte maximale.
J'ai eu le même problème. Voici comment j'ai fait pour aligner le texte au bas de mon UILabel:
- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode];
switch (vertAlign) {
case 0: // align = top
l.frame = CGRectMake(l.frame.Origin.x,
l.frame.Origin.y,
l.frame.size.width,
stringSize.height
);
break;
case 1: // align = bottom
l.frame = CGRectMake(l.frame.Origin.x,
(l.frame.Origin.y + l.frame.size.height) - stringSize.height,
l.frame.size.width,
stringSize.height
);
break;
case 2: // align = middle
// default
break;
}
l.text = text;
}
Ahd vous appelez simplement la méthode comme celle-ci pour l'aligner en bas:
[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1];
Une autre option: utilisez une étiquette pour votre couleur d'arrière-plan, j'appelle celle-ci originalLabel, et une autre pour le texte, appelée textLabel dans mon exemple. Ensuite, calculez la hauteur et la coordonnée Y pour textLabel:
[textLabel sizeToFit];
int height = textLabel.frame.size.height;
int yCoord = originalLabel.frame.Origin.y +
originalLabel.frame.size.height - height;
textLabel.frame = CGRectMake( originalLabel.frame.Origin.x, yCoord,
textLabel.frame.size.width, height);