web-dev-qa-db-fra.com

Comment aligner le texte UILabel du bas?

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.

enter image description here

Veuillez suggérer vos idées.

Je vous remercie.

33
NSUserDefault

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};
22
Paras Joshi

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
19
Dustin

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
11
Dunbar

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.

3
Tobe

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];
0
barrast

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);
0
autremoi