Comment définir l'alignement en haut à gauche pour l'application UILabel pour iOS?

99

J'ai ajouté une étiquette dans mon fichier nib, puis il est nécessaire d'avoir un alignement en haut à gauche pour cette étiquette. Comme je fournis du texte au moment de l'exécution, ce n'est pas sûr de savoir combien de lignes il y a. Donc, si le texte ne contient qu'une seule ligne, il apparaît comme aligné verticalement au centre. Cet alignement ne correspond pas à mon étiquette respective devant lui.

Par exemple:

entrez la description de l'image ici

Ce qui semble étrange :(

Existe-t-il un moyen de définir le texte d'étiquette approprié à l'alignement en haut à gauche?

Mrunal
la source
duplication possible du texte aligné verticalement dans un UILabel
HDdeveloper

Réponses:

65

C'est assez facile à faire. Créez une sous- UILabelcatégorie avec une verticalAlignmentpropriété et un remplacement textRectForBounds:limitedToNumberOfLinespour renvoyer les limites correctes pour un alignement vertical en haut, au milieu ou en bas. 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
Memmons
la source
3
J'ai également essayé de nombreuses autres solutions ici sur SO avant de traverser celle-ci. Cela a parfaitement fonctionné! Gardez à l'esprit que si vous faites cela dans StoryBoard, assurez-vous de définir l'attribut CustomClass sur SOLabel (ou le nom que vous décidez de lui donner) au lieu de UILabel (dans l'inspecteur des utilitaires).
TMc
Ceci est très utile, merci. Cela ne fonctionne pas pour le texte aligné au centre ou à droite, mais l'utilisation bounds.size.widthau lieu de rect.size.widthin textRectForBounds:limitedToNumberOfLines:semble résoudre ce problème.
Geoff Hackworth
1
Si vous avez rencontré 'Thread 1: EXC_BAD_ACCESS (Code 2, address = 0x ...)' dans iOS 9 Xcode 7, supprimez simplement le setter et le getter - (VerticalAlignment) verticalAlignment; et - (void) setVerticalAlignment: fonctions de valeur (VerticalAlignment), puisque la variable est @property. Il est synthétisé et contient des accesseurs.
felixwcf
j'ai quelques modifications ici dans la méthode: "textRectForBounds" - result = CGRectMake (rect.origin.x, bounds.origin.y, rect.size.width, rect.size.height); Pour rendre mes travaux pour rightAlignment UILable.
g212gs
50

J'ai trouvé une solution en utilisant AutoLayout dans StoryBoard.

1) Définissez le nombre de lignes sur 0 et l'alignement du texte sur la gauche.

entrez la description de l'image ici

2) Définissez la contrainte de hauteur.

entrez la description de l'image ici

3) La contrainte de hauteur doit être en relation - inférieure ou égale

entrez la description de l'image ici

4)

   override func viewWillLayoutSubviews() {
        sampleLabel.sizeToFit()
    }

J'ai obtenu le résultat comme suit:

entrez la description de l'image ici

AG
la source
2
Fonctionne comme un charme, même dans un UITableViewCell avec réutilisation.
alex.bour
Placez-vous le viewWillLayoutSubviewsdans le contrôleur ou le fichier de cellule? Si le contrôleur, comment accède-t-il à l'UILabel à partir de la cellule?
Craig.Pearce
Où mettez-vous l'étape 4? En tant que nouvel utilisateur, j'étais ravi d'avoir une solution purement UI, puis ce code sort de nulle part et on ne nous dit pas où le mettre
velkoon
Soit sur SampleClass.swift ou SampleTableViewCell.swift
AG
Cela devrait être la solution. Fonctionne parfaitement, aucun piratage ou sous-classement requis.
Curious101 du
45

Le SOLabel fonctionne pour moi.

Swift 3 et 5:

Cette version a été mise à jour par rapport à l'original pour permettre la prise en charge des langues RTL:

public class VerticalAlignLabel: UILabel {
    enum VerticalAlignment {
        case top
        case middle
        case bottom
    }

    var verticalAlignment : VerticalAlignment = .top {
        didSet {
            setNeedsDisplay()
        }
    }

    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)

        if UIView.userInterfaceLayoutDirection(for: .unspecified) == .rightToLeft {
            switch verticalAlignment {
            case .top:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
            case .middle:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
            case .bottom:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
            }
        } else {
            switch verticalAlignment {
            case .top:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
            case .middle:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
            case .bottom:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
            }
        }
    }

    override public func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}

Swift 1:

class UIVerticalAlignLabel: UILabel {

enum VerticalAlignment : Int {
    case VerticalAlignmentTop = 0
    case VerticalAlignmentMiddle = 1
    case VerticalAlignmentBottom = 2
}

var verticalAlignment : VerticalAlignment = .VerticalAlignmentTop {
    didSet {
        setNeedsDisplay()
    }
}

required init(coder aDecoder: NSCoder){
    super.init(coder: aDecoder)
}

override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
    let rect = super.textRectForBounds(bounds, limitedToNumberOfLines: limitedToNumberOfLines)

    switch(verticalAlignment) {
        case .VerticalAlignmentTop:
            return CGRectMake(bounds.origin.x, bounds.origin.y, rect.size.width, rect.size.height)
        case .VerticalAlignmentMiddle:
            return CGRectMake(bounds.origin.x, bounds.origin.y + (bounds.size.height - rect.size.height) / 2, rect.size.width, rect.size.height)
        case .VerticalAlignmentBottom:
            return CGRectMake(bounds.origin.x, bounds.origin.y + (bounds.size.height - rect.size.height), rect.size.width, rect.size.height)
        default:
            return bounds
    }
}

override func drawTextInRect(rect: CGRect) {
    let r = self.textRectForBounds(rect, limitedToNumberOfLines: self.numberOfLines)
    super.drawTextInRect(r)
    }
}
totiG
la source
Si j'essaye de créer une étiquette en utilisant ce code: var myLabel = VerticalAlignLabel () j'obtiens un "argument manquant pour le paramètre 'coder' dans l'appel". Comment puis-je créer une étiquette à l'aide de cette sous-classe VerticalAlignLabel?
RanLearns
1
Essayez la version 3 de Swift maintenant - j'avais un init requis qui n'est pas nécessaire.
totiG
14

Dans mon cas, c'était une bottom spacequestion de contrainte. Je l'avais mis à = 16.

Lorsque je l'ai réglé sur bottom to >= 16, ce problème a été résolu.

De plus, si vous avez une contrainte de hauteur dans l'étiquette, vous devez la supprimer.

Voici la vue des contraintes de mon étiquette dans l'inspecteur de taille:

contrainte

Mukesh Chapagain
la source
Je n'ai pas d'options de contrainte lorsque je sélectionne une étiquette.
velkoon
Solution la plus simple - laissez les contraintes et la disposition automatique s'en occuper. Merci!
Jason le
13

Dans votre code

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

Sachez que si vous l'utilisez dans des cellules de tableau ou d'autres vues recyclées avec des données différentes, vous devrez stocker l'image d'origine quelque part et la réinitialiser avant d'appeler sizeToFit.

n13
la source
Je recommanderais en fait de tout laisser à Autolayout à ce stade. Ce n'est plus nécessaire.
n13 du
9

J'ai trouvé une autre solution pour le même problème. J'ai utilisé UITextViewau lieu de UILabelet j'ai changé de editable()fonction false.

Maxim Zh
la source
@geekyaleks Pourquoi est-ce un hack stupide? Cela semble être une solution de contournement décente, y a-t-il d'autres problèmes en plus de ne pas être une réponse directe à la question?
Christopher Larsen
Ce n'est pas approprié, car vous n'utilisez pas le composant d'interface utilisateur approprié pour le travail. Cela ne devrait PAS être un compromis pour quelque chose d'aussi simple que l'alignement vertical. Besoin d'utiliser le bon composant pour le travail. Tout le reste est un hack ...
geekyaleks
7

J'avais également ce problème, mais ce que j'ai trouvé, c'est l'ordre dans lequel vous définissez les propriétés et les méthodes de l'UILabel!

Si vous appelez [label sizeToFit]avant, label.font = [UIFont fontWithName:@"Helvetica" size:14];le texte ne s'aligne pas sur le haut, mais si vous les échangez, c'est le cas!

J'ai également remarqué que définir le texte en premier fait également une différence.

J'espère que cela t'aides.

Rharvey
la source
Génial. sizeToFit () doit être appelé à la toute dernière.
MKatleast3
4

Lorsque vous utilisez le générateur d'interface, définissez les contraintes de votre étiquette (assurez-vous de définir également la hauteur et la largeur). Ensuite, dans l'inspecteur de taille, vérifiez la hauteur de l'étiquette. Là, vous voudrez qu'il lise> = au lieu de =. Ensuite, dans l'implémentation de ce contrôleur de vue, définissez le nombre de lignes sur 0 (cela peut également être fait dans IB) et définissez l'étiquette [label sizeToFit]; et au fur et à mesure que votre texte gagne en longueur, l'étiquette augmentera en hauteur et gardera votre texte en haut à gauche.

TomG103
la source
4

Si vous avez besoin d'un texte non modifiable qui commence par défaut dans le coin supérieur gauche, vous pouvez simplement utiliser une vue de texte au lieu d'une étiquette, puis définir son état sur non modifiable, comme ceci:

textview.isEditable = false

Bien plus facile que de jouer avec les étiquettes ...

À votre santé!

Alejandro Camus
la source
3

La solution avec SoLabel fonctionne, merci.

Ci-dessous, j'ai ajouté la version monotouch:

    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
}
plvlad
la source
3

Le moyen le plus simple et le plus simple consiste à intégrer Label dans StackView et à définir l'axe de StackView sur Horizontal, Alignment to Top dans Attribute Inspector de Storyboard comme indiqué ici .

Baig
la source
2

En s'appuyant sur la réponse impressionnante de totiG, j'ai créé une classe IBDesignable qui rend extrêmement facile la personnalisation de l'alignement vertical d'un UILabel directement depuis le StoryBoard. Assurez-vous simplement de définir la classe de votre UILabel sur «VerticalAlignLabel» à partir de l'inspecteur d'identité StoryBoard. Si l'alignement vertical ne prend pas effet, allez dans Editor-> Refresh All Views qui devrait faire l'affaire.

Comment cela fonctionne: Une fois que vous avez correctement défini la classe de votre UILabel, le storyboard devrait vous montrer un champ de saisie qui prend un entier (code d'alignement).

Mise à jour: j'ai ajouté la prise en charge des étiquettes centrées ~ Sev


Entrez 0 pour l'alignement supérieur

Entrez 1 pour l'alignement au milieu

Entrez 2 pour l'alignement inférieur

    @IBDesignable class VerticalAlignLabel: UILabel {
    
    @IBInspectable var alignmentCode: Int = 0 {
        didSet {
            applyAlignmentCode()
        }
    }
    
    func applyAlignmentCode() {
        switch alignmentCode {
        case 0:
            verticalAlignment = .top
        case 1:
            verticalAlignment = .topcenter
        case 2:
            verticalAlignment = .middle
        case 3:
            verticalAlignment = .bottom
        default:
            break
        }
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.applyAlignmentCode()
    }
    
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        
        self.applyAlignmentCode()
    }
    
    enum VerticalAlignment {
        case top
        case topcenter
        case middle
        case bottom
    }
    
    var verticalAlignment : VerticalAlignment = .top {
        didSet {
            setNeedsDisplay()
        }
    }
    
    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)
        
        if #available(iOS 9.0, *) {
            if UIView.userInterfaceLayoutDirection(for: .unspecified) == .rightToLeft {
                switch verticalAlignment {
                case .top:
                    return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .topcenter:
                    return CGRect(x: self.bounds.size.width - (rect.size.width / 2), y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .middle:
                    return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
                case .bottom:
                    return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
                }
            } else {
                switch verticalAlignment {
                case .top:
                    return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .topcenter:
                    return CGRect(x: (self.bounds.size.width / 2 ) - (rect.size.width / 2), y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .middle:
                    return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
                case .bottom:
                    return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
                }
            }
        } else {
            // Fallback on earlier versions
            return rect
        }
    }
    
    override public func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}

Nino Bouchedid
la source
2

vous pouvez également simplement changer votre UILabel en UITextView, car ils font essentiellement la même chose sauf que l'avantage de UITextView est que le texte est automatiquement aligné en haut à gauche

Ndamu
la source
1

J'ai ce problème mais mon étiquette était dans UITableViewCell, et dans le fond que le moyen le plus simple de résoudre le problème était de créer un UIView vide et de définir l'étiquette à l'intérieur avec des contraintes vers le haut et le côté gauche uniquement, sur off malédiction définir le nombre de lignes sur 0

Hiram Elguezabal
la source
0

Pour iOS 7, c'est ce que j'ai fait et travaillé pour moi

@implementation UILabel (VerticalAlign)
- (void)alignTop
{
    CGSize boundingRectSize = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
    NSDictionary *attributes = @{NSFontAttributeName : self.font};
    CGRect labelSize = [self.text boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                              attributes:attributes
                                                 context:nil];
    int numberOfLines= ceil(labelSize.size.height / self.font.lineHeight);

    CGRect newFrame = self.frame;
    newFrame.size.height = numberOfLines * self.font.lineHeight;
    self.frame = newFrame;
}

- (void)alignBottom
{
    CGSize boundingRectSize = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
    NSDictionary *attributes = @{NSFontAttributeName : self.font};
    CGRect labelSize = [self.text boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                            attributes:attributes
                                               context:nil];
    int numberOfLines= ceil(labelSize.size.height / self.font.lineHeight);

    int numberOfNewLined = (self.frame.size.height/self.font.lineHeight) - numberOfLines;

    NSMutableString *newLines = [NSMutableString string];
    for(int i=0; i< numberOfNewLined; i++){
        [newLines appendString:@"\n"];
    }
    [newLines appendString:self.text];
    self.text = [newLines mutableCopy];
}
nahlamortada
la source
0

Swift 2.0:: Utilisation de l'extension UILabel

Créez des valeurs d'énumération constantes dans un fichier Swift vide.

//  AppRef.swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

 case VERTICAL_ALIGNMENT_TOP = "VerticalAlignmentTop"
 case VERTICAL_ALIGNMENT_MIDDLE = "VerticalAlignmentMiddle"
 case VERTICAL_ALIGNMENT_BOTTOM = "VerticalAlignmentBottom"

}

Utilisation de l'extension UILabel:

Créez une classe Swift vide et nommez-la. Ajoutez ce qui suit.

//  AppExtensions.swift

import Foundation
import UIKit

    extension UILabel{ 
     func makeLabelTextPosition (sampleLabel :UILabel?, positionIdentifier : String) -> UILabel
     {
      let rect = sampleLabel!.textRectForBounds(bounds, limitedToNumberOfLines: 0)

      switch positionIdentifier
      {
      case "VerticalAlignmentTop":
       sampleLabel!.frame = CGRectMake(bounds.origin.x+5, bounds.origin.y, rect.size.width, rect.size.height)
       break;

      case "VerticalAlignmentMiddle":
       sampleLabel!.frame = CGRectMake(bounds.origin.x+5,bounds.origin.y + (bounds.size.height - rect.size.height) / 2,
        rect.size.width, rect.size.height);
       break;

      case "VerticalAlignmentBottom":
       sampleLabel!.frame = CGRectMake(bounds.origin.x+5, bounds.origin.y + (bounds.size.height - rect.size.height),rect.size.width, rect.size.height);
       break;

      default:
       sampleLabel!.frame = bounds;
       break;
      }
      return sampleLabel!

     }
    }

Utilisation:

myMessageLabel.makeLabelTextPosition(messageLabel, positionIdentifier: UILabelTextPositions.VERTICAL_ALIGNMENT_TOP.rawValue)
AG
la source
Pourriez-vous expliquer ce qui est nécessaire sampleLabel: UILabel??
Craig.Pearce
Sur cette fonction makeLabelTextPosition (sampleLabel: UILabel ?, positionIdentifier: String) {}, vous devez passer l'objet UILabel.
AG
0

Version Swift 3 de la réponse de @ totiG

class UIVerticalAlignLabel: UILabel {
    enum VerticalAlignment : Int {
        case VerticalAlignmentTop = 0
        case VerticalAlignmentMiddle = 1
        case VerticalAlignmentBottom = 2
    }

    @IBInspectable var verticalAlignment : VerticalAlignment = .VerticalAlignmentTop {
        didSet {
            setNeedsDisplay()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)

        switch(verticalAlignment) {
        case .VerticalAlignmentTop:
            return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
        case .VerticalAlignmentMiddle:
            return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
        case .VerticalAlignmentBottom:
            return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
        }
    }

    override func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}
bz13
la source
0

La réponse de @ totiG est correcte et a résolu mon problème. Mais j'ai trouvé un problème lors de la mise en œuvre de cette méthode, dans des appareils plus petits comme 5s, SE, cela ne fonctionne pas pour moi. Je dois mettre label.sizeToFit()enoverride func layoutSubViews()

override func layoutSubViews() {
    super.layoutSubViews()
    // Do other works if needed
    label.sizeToFit()
}
Ankur Lahiry
la source
0

Swift 5

C'est simple, l'ordre des propriétés est tout.

titleLabel.frame = CGRect(x: 20, y: 20, width: 374, height: 291.2)
titleLabel.backgroundColor = UIColor.clear //set a light color to see the frame
titleLabel.textAlignment = .left
titleLabel.lineBreakMode = .byTruncatingTail
titleLabel.numberOfLines = 4
titleLabel.font = UIFont(name: "HelveticaNeue-Bold", size: 35)
titleLabel.text = "Example"
titleLabel.sizeToFit()
self.view.addSubview(titleLabel)
carlosobedgomez
la source
-2

Comment définir l'alignement en haut à gauche pour l'application UILabel pour iOS? Étiquette Définir le mode de contenu sur "En haut à gauche" fonctionne pour moi, merci beaucoup:
Comment définir l'alignement en haut à gauche pour l'application UILabel pour iOS?  Étiquette Définir le mode de contenu sur "En haut à gauche" fonctionne pour moi, merci beaucoup

mahasam
la source
1
Ne fait absolument rien pour moi. Cela semble intuitivement que cela devrait être la solution, c'est pourquoi je me suis tourné vers Google quand cela ne fonctionnait pas (ou semble-t-il tout faire, d'ailleurs).
velkoon