103 votes

Comment mettre en haut à gauche de l'alignement pour UILabel pour application iOS?

J'ai ajouté une étiquette dans ma plume fichier, puis sa nécessaire d'avoir en haut à gauche alignement d'étiquette. Comme je suis de fournir des textes au moment de l'exécution si ce n'est pas sûr de combien de lignes y sont. Donc, si le texte contient une seule ligne alors qu'il apparaît comme à la verticale-centre d'aligné. Que l'alignement n'est pas de correspondance avec mon respectifs lable en face d'elle.

Par exemple:

enter image description here

Qui est à la recherche impair :(

Est-il possible où je peux mettre le texte de l'étiquette appropriée à en Haut à Gauche de l'alignement?

65voto

Michael G. Emmons Points 16681

Il est assez facile à faire. Créer un UILabel sous-classe avec un verticalAlignment de la propriété et de remplacer textRectForBounds:limitedToNumberOfLines de retour les bornes correctes pour un haut, au milieu ou en bas de l'alignement vertical. Voici le code:

SOLabel.h

#import <UIKit/UIKit.h>

typedef enum
{
    VerticalAlignmentTop = 0, // default
    VerticalAlignmentMiddle,
    VerticalAlignmentBottom,
} VerticalAlignment;

@interface SOLabel : UILabel

   @property (nonatomic, readwrite) VerticalAlignment verticalAlignment;

@end

SOLabel.m

@implementation SOLabel

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (!self) return nil;

    // set inital value via IVAR so the setter isn't called
    _verticalAlignment = VerticalAlignmentTop;

    return self;
}

-(VerticalAlignment) verticalAlignment
{
    return _verticalAlignment;
}

-(void) setVerticalAlignment:(VerticalAlignment)value
{
    _verticalAlignment = value;
    [self setNeedsDisplay];
}

// align text block according to vertical alignment settings
-(CGRect)textRectForBounds:(CGRect)bounds 
    limitedToNumberOfLines:(NSInteger)numberOfLines
{
   CGRect rect = [super textRectForBounds:bounds 
                   limitedToNumberOfLines:numberOfLines];
    CGRect result;
    switch (_verticalAlignment)
    {
       case VerticalAlignmentTop:
          result = CGRectMake(bounds.origin.x, bounds.origin.y, 
                              rect.size.width, rect.size.height);
           break;

       case VerticalAlignmentMiddle:
          result = CGRectMake(bounds.origin.x, 
                    bounds.origin.y + (bounds.size.height - rect.size.height) / 2,
                    rect.size.width, rect.size.height);
          break;

       case VerticalAlignmentBottom:
          result = CGRectMake(bounds.origin.x, 
                    bounds.origin.y + (bounds.size.height - rect.size.height),
                    rect.size.width, rect.size.height);
          break;

       default:
          result = bounds;
          break;
    }
    return result;
}

-(void)drawTextInRect:(CGRect)rect
{
    CGRect r = [self textRectForBounds:rect 
                limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:r];
}

@end

63voto

shawnwall Points 3127

Plutôt que de ré-expliquer, j'ai un lien vers ce très vaste et très bien cotées question/réponse:

Alignez verticalement le texte dans un UILabel

La réponse courte est non, Apple n'a pas fait que cela est facile, mais il est possible en changeant la taille de l'image.

13voto

n13 Points 1506

Dans votre code

label.text = @"some text";
[label sizeToFit];

Attention, si vous utilisez le tableau de cellules ou d'autres points de vue qui sont recyclés avec des données différentes, vous aurez besoin de stocker l'image d'origine quelque part et de le réinitialiser avant d'appeler sizeToFit.

7voto

rharvey Points 162

J'ai été aussi à avoir ce problème, mais ce que j'ai trouvé était de l'ordre dans lequel vous définissez la UILabel propriétés et méthodes de questions!

Si vous appelez [label sizeToFit] avant label.font = [UIFont fontWithName:@"Helvetica" size:14]; alors que le texte ne correspond pas au top, mais si vous les échanger autour de il ne!

J'ai aussi remarqué que le réglage d'abord le texte fait une différence aussi.

Espérons que cette aide.

3voto

plvlad Points 1

Solution avec SoLabel fonctionne , Merci.

Soufflet, j'ai ajouté monotouch version:

    public class UICustomLabel : UILabel
{
    private UITextVerticalAlignment _textVerticalAlignment;

    public UICustomLabel()
    {
        TextVerticalAlignment = UITextVerticalAlignment.Top;
    }

    public UITextVerticalAlignment TextVerticalAlignment
    {
        get
        {
            return _textVerticalAlignment;
        }
        set
        {
            _textVerticalAlignment = value;
            SetNeedsDisplay();
        }
    }

    public override void DrawText(RectangleF rect)
    {
        var bound = TextRectForBounds(rect, Lines);
        base.DrawText(bound);
    }

    public override RectangleF TextRectForBounds(RectangleF bounds, int numberOfLines)
    {
        var rect = base.TextRectForBounds(bounds, numberOfLines);
        RectangleF resultRect;
        switch (TextVerticalAlignment)
        {
            case UITextVerticalAlignment.Top:
                resultRect = new RectangleF(bounds.X, bounds.Y, rect.Size.Width, rect.Size.Height);
                break;
            case UITextVerticalAlignment.Middle:
                resultRect = new RectangleF(bounds.X,
                                            bounds.Y + (bounds.Size.Height - rect.Size.Height)/2,
                                            rect.Size.Width, rect.Size.Height);
                break;
            case UITextVerticalAlignment.Bottom:
                resultRect = new RectangleF(bounds.X,
                                            bounds.Y + (bounds.Size.Height - rect.Size.Height),
                                            rect.Size.Width, rect.Size.Height);
                break;

            default:
                resultRect = bounds;
                break;
        }

        return resultRect;
    }
}

public enum UITextVerticalAlignment
{
    Top = 0, // default
    Middle,
    Bottom
}

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