Wie stelle ich die Ausrichtung von links oben für UILabel für iOS-Anwendungen ein?


99

Ich habe ein Etikett in meine NIB-Datei eingefügt, dann muss es für dieses Etikett oben links ausgerichtet sein. Da ich zur Laufzeit Text bereitstelle, ist es nicht sicher, wie viele Zeilen vorhanden sind. Wenn Text nur eine einzelne Zeile enthält, wird er vertikal mittig ausgerichtet angezeigt. Diese Ausrichtung stimmt nicht mit meinem jeweiligen Etikett davor überein.

Beispielsweise:

Geben Sie hier die Bildbeschreibung ein

Was seltsam aussieht :(

Gibt es eine Möglichkeit, den Beschriftungstext auf die Ausrichtung oben links einzustellen?


Antworten:



64

Das ist ziemlich einfach. Erstellen Sie eine UILabelUnterklasse mit einer verticalAlignmentEigenschaft und überschreiben Sie diese textRectForBounds:limitedToNumberOfLines, um die korrekten Grenzen für eine vertikale Ausrichtung oben, in der Mitte oder unten zurückzugeben. Hier ist der 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

3
Ich habe hier auf SO auch viele andere Lösungen ausprobiert, bevor ich auf diese gestoßen bin. Es hat perfekt funktioniert! Beachten Sie, dass Sie in diesem Fall in StoryBoard sicherstellen, dass Sie das CustomClass-Attribut auf SOLabel (oder wie auch immer Sie es benennen) anstelle von UILabel (im Dienstprogramminspektor) setzen.
TMc

Das ist sehr hilfreich, danke. Es funktioniert nicht für zentrierten oder rechtsbündigen Text, aber die Verwendung bounds.size.widthanstelle von rect.size.widthin textRectForBounds:limitedToNumberOfLines:scheint dies zu beheben.
Geoff Hackworth

1
Wenn Sie in iOS 9 Xcode 7 auf 'Thread 1: EXC_BAD_ACCESS (Code 2, Adresse = 0x ...)' gestoßen sind, entfernen Sie einfach den Setter und Getter - (VerticalAlignment) verticalAlignment; und - (void) setVerticalAlignment: (VerticalAlignment) Wertfunktionen, da die Variable @property ist. Es ist synthetisiert und enthält Accessoren.
felixwcf

Ich habe hier in der Methode einige Änderungen vorgenommen: "textRectForBounds" - result = CGRectMake (rect.origin.x, bounds.origin.y, rect.size.width, rect.size.height); Um meine Arbeiten für rightAlignment UILable zu machen.
g212gs

49

Ich habe eine Lösung mit AutoLayout in StoryBoard gefunden.

1) Setzen Sie die Anzahl der Zeilen auf 0 und die Textausrichtung auf Links.

Geben Sie hier die Bildbeschreibung ein

2) Stellen Sie die Höhenbeschränkung ein.

Geben Sie hier die Bildbeschreibung ein

3) Die Höhenbeschränkung sollte in Beziehung stehen - kleiner als oder gleich

Geben Sie hier die Bildbeschreibung ein

4)

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

Ich habe das Ergebnis wie folgt erhalten:

Geben Sie hier die Bildbeschreibung ein


2
Funktioniert wie ein Zauber, auch in einer UITableViewCell mit Wiederverwendung.
Alex.bour

Platzieren Sie die viewWillLayoutSubviewsin der Steuerung oder der Zellendatei? Wenn der Controller, wie greift er von der Zelle aus auf das UILabel zu?
Craig.Pearce

Wo setzen Sie Schritt 4? Als neuer Benutzer war ich begeistert von einer reinen UI-Lösung, dann kommt dieser Code aus dem Nichts und uns wird nicht gesagt, wo er abgelegt werden soll
velkoon

Entweder auf SampleClass.swift oder SampleTableViewCell.swift
AG

Dies sollte die Lösung sein. Funktioniert perfekt, kein Hack oder Unterklassen erforderlich.
Curious101

44

Das SOLabel funktioniert bei mir.

Swift 3 & 5:

Diese Version wurde vom Original aktualisiert, um die Unterstützung von RTL-Sprachen zu ermöglichen:

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)
    }
}

Wenn ich versuche, mit diesem Code ein Label zu erstellen: var myLabel = VerticalAlignLabel () Ich erhalte ein "Fehlendes Argument für den Parameter 'coder' im Aufruf". Wie kann ich mit dieser VerticalAlignLabel-Unterklasse ein Label erstellen?
RanLearns

1
Probieren Sie jetzt die Swift-Version 3 aus - ich hatte eine erforderliche Init, die nicht benötigt wird.
TotiG

14

In meinem Fall handelte es sich um ein bottom spaceEinschränkungsproblem. Ich hatte es eingestellt = 16.

Als ich es einstellte, bottom to >= 16wurde dieses Problem gelöst.

Wenn das Etikett eine Höhenbeschränkung enthält, müssen Sie diese entfernen.

Hier ist die Einschränkungsansicht meines Etiketts im Größeninspektor:

Zwang


Ich habe keine Einschränkungsoptionen, wenn ich eine Beschriftung auswähle.
Velkoon

Einfachste Lösung - lassen Sie Einschränkungen und das automatische Layout dafür sorgen. Vielen Dank!
Jason

13

In deinem Code

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

Beachten Sie, dass Sie, wenn Sie dies in Tabellenzellen oder anderen Ansichten verwenden, die mit unterschiedlichen Daten recycelt werden, den ursprünglichen Frame irgendwo speichern und zurücksetzen müssen, bevor Sie sizeToFit aufrufen.


Ich würde empfehlen, an dieser Stelle alles Autolayout zu überlassen. Dies wird nicht mehr benötigt.
n13

9

Ich habe eine andere Lösung für das gleiche Problem gefunden. Ich habe UITextViewstatt UILabelund editable()Funktion umgeschaltet false.


@geekyaleks Warum ist das ein dummer Hack? Scheint eine anständige Problemumgehung zu sein. Gibt es noch andere Probleme, als keine direkte Antwort auf die Frage zu sein?
Christopher Larsen

Dies ist nicht angemessen, da Sie nicht die entsprechende UI-Komponente für den Job verwenden. Es sollte KEIN Kompromiss für etwas so Einfaches wie die vertikale Ausrichtung sein. Sie müssen die richtige Komponente für den Job verwenden. Alles andere ist ein Hack ...
Geekyaleks

7

Ich hatte auch dieses Problem, aber was ich fand, war die Reihenfolge, in der Sie die Eigenschaften und Methoden des UILabels festlegen!

Wenn Sie [label sizeToFit]vorher anrufen, label.font = [UIFont fontWithName:@"Helvetica" size:14];wird der Text nicht nach oben ausgerichtet, aber wenn Sie sie vertauschen, ist dies der Fall!

Mir ist auch aufgefallen, dass das Festlegen des Textes zuerst einen Unterschied macht.

Hoffe das hilft.


Toll. sizeToFit () sollte zuletzt aufgerufen werden.
MKatleast3

4

Legen Sie bei Verwendung des Interface Builder die Einschränkungen für Ihre Beschriftung fest (stellen Sie sicher, dass Sie auch die Höhe und Breite festlegen). Überprüfen Sie dann im Größeninspektor die Höhe des Etiketts. Dort soll es> = statt = lauten. Setzen Sie dann in der Implementierung für diesen Ansichts-Controller die Anzahl der Zeilen auf 0 (kann auch in IB durchgeführt werden) und setzen Sie das Label [label sizeToFit]; Wenn Ihr Text an Länge gewinnt, wird die Beschriftung höher und Ihr Text bleibt oben links.


4

Wenn Sie nicht bearbeitbaren Text benötigen, der standardmäßig in der oberen linken Ecke beginnt, können Sie einfach eine Textansicht anstelle einer Beschriftung verwenden und den Status wie folgt auf nicht bearbeitbar setzen:

textview.isEditable = false

Viel einfacher als mit den Etiketten herumzuspielen ...

Prost!


3

Lösung mit SoLabel funktioniert, danke.

Unten habe ich eine Monotouch-Version hinzugefügt:

    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
}

3

Der einfachste und einfachste Weg besteht darin, die Beschriftung in StackView einzubetten und die Achse von StackView auf Horizontal und die Ausrichtung im Attributinspektor vom Storyboard nach oben zu setzen, wie hier gezeigt .


2

Aufbauend auf der großartigen Antwort von totiG habe ich eine IBDesignable-Klasse erstellt, mit der sich die vertikale Ausrichtung eines UILabels direkt vom StoryBoard aus ganz einfach anpassen lässt. Stellen Sie einfach sicher, dass Sie die Klasse Ihres UILabels im StoryBoard-Identitätsinspektor auf 'VerticalAlignLabel' setzen. Wenn die vertikale Ausrichtung nicht wirksam wird, gehen Sie zu Editor-> Alle Ansichten aktualisieren, um den Trick auszuführen.

So funktioniert es: Sobald Sie die Klasse Ihres UILabels richtig festgelegt haben, sollte das Storyboard ein Eingabefeld anzeigen, das eine Ganzzahl (Ausrichtungscode) enthält.

Update: Ich habe Unterstützung für zentrierte Labels hinzugefügt ~ Sev


Geben Sie 0 für Top Alignment ein

Geben Sie 1 für die mittlere Ausrichtung ein

Geben Sie 2 für die Bodenausrichtung ein

    @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)
    }
}


2

Sie können Ihr UILabel auch einfach in UITextView ändern, da diese im Grunde dasselbe tun, außer dass der Vorteil von UITextView darin besteht, dass der Text automatisch oben links ausgerichtet wird


1

Ich habe dieses Problem, aber mein Etikett befand sich in UITableViewCell, und im Fonds bestand der einfachste Weg, das Problem zu lösen, darin, ein leeres UIView zu erstellen und das Etikett darin mit Einschränkungen nur nach oben und nach links zu setzen Setzen Sie die Anzahl der Zeilen auf 0


0

Für iOS 7 habe ich das gemacht und für mich gearbeitet

@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];
}

0

Swift 2.0 :: Verwenden der UILabel-Erweiterung

Erstellen Sie konstante Aufzählungswerte in einer leeren Swift-Datei.

//  AppRef.swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

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

}

Verwenden der UILabel-Erweiterung:

Erstellen Sie eine leere Swift-Klasse und benennen Sie sie. Fügen Sie Folgendes hinzu.

//  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!

     }
    }

Verwendung :

myMessageLabel.makeLabelTextPosition(messageLabel, positionIdentifier: UILabelTextPositions.VERTICAL_ALIGNMENT_TOP.rawValue)

Können Sie erklären, wofür es benötigt wird sampleLabel: UILabel??
Craig.Pearce

Auf dieser Funktion makeLabelTextPosition (sampleLabel: UILabel?, PositionIdentifier: String) {} müssen Sie das UILabel-Objekt übergeben.
AG

0

Swift 3-Version der Antwort von @ 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)
    }
}

0

Die Antwort von @ totiG ist richtig und hat mein Problem gelöst. Bei der Implementierung dieser Methode ist jedoch ein Problem aufgetreten. Bei kleineren Geräten wie 5s, SE funktioniert dies bei mir nicht. Ich muss Satz label.sizeToFit()inoverride func layoutSubViews()

override func layoutSubViews() {
    super.layoutSubViews()
    // Do other works if needed
    label.sizeToFit()
}

0

Swift 5

Es ist einfach, die Reihenfolge der Eigenschaften ist alles.

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)

-2

Wie stelle ich die Ausrichtung von links oben für UILabel für iOS-Anwendungen ein? Label Set Content Mode auf "Top Left" funktioniert für mich, vielen Dank:
Wie stelle ich die Ausrichtung von links oben für UILabel für iOS-Anwendungen ein?  Label Set Content Mode auf "Top Left" funktioniert für mich, vielen Dank


1
Tut absolut nichts für mich. Dies scheint intuitiv so zu sein, als ob es die Lösung sein sollte. Deshalb habe ich mich an Google gewandt, als es nicht funktioniert hat (oder anscheinend alles getan hat).
Velkoon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.