Jak ustawić wyrównanie do lewej górnej części aplikacji UILabel na iOS?

99

Dodałem jedną etykietę do mojego pliku nib, a następnie wymagane jest wyrównanie do lewej górnej części tej etykiety. Ponieważ dostarczam tekst w czasie wykonywania, więc nie jest pewien, ile jest tam wierszy. Jeśli więc tekst zawiera tylko jedną linię, jest wyświetlany jako wyrównany do środka w pionie. To wyrównanie nie pasuje do mojej odpowiedniej etykiety przed nim.

Na przykład:

wprowadź opis obrazu tutaj

Co wygląda dziwnie :(

Czy istnieje sposób, w jaki mogę ustawić tekst etykiety na wyrównanie od góry do lewej?

Mrunal
źródło
możliwy duplikat wyrównywania w pionie tekstu w UILabel
HDdeveloper

Odpowiedzi:

62

Zamiast ponownego wyjaśniania, podam link do tego dość obszernego i wysoko ocenianego pytania / odpowiedzi:

Wyrównaj tekst w pionie do góry w UILabel

Krótka odpowiedź brzmi: nie, Apple nie ułatwiło tego, ale jest to możliwe dzięki zmianie rozmiaru ramki.

shawnwall
źródło
65

To dość łatwe. Utwórz UILabelpodklapę z verticalAlignmentwłaściwością i nadpisz ją, textRectForBounds:limitedToNumberOfLinesaby zwrócić prawidłowe granice dla górnego, środkowego lub dolnego wyrównania w pionie. Oto kod:

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
źródło
3
Wypróbowałem również wiele innych rozwiązań tutaj na SO, zanim uruchomiłem to. Udało się idealnie! Pamiętaj, że jeśli robisz to w StoryBoard, upewnij się, że ustawiłeś atrybut CustomClass na SOLabel (lub jakkolwiek zdecydujesz się go nazwać) zamiast UILabel (w Inspektorze narzędzi).
TMc
To jest bardzo pomocne, dziękuję. Nie działa w przypadku tekstu wyrównanego do środka lub do prawej strony, ale użycie bounds.size.widthzamiast rect.size.widthin textRectForBounds:limitedToNumberOfLines:wydaje się to naprawiać.
Geoff Hackworth,
1
Jeśli napotkasz „Wątek 1: EXC_BAD_ACCESS (Kod 2, adres = 0x ...)” w iOS 9 Xcode 7, po prostu usuń metodę ustawiającą i pobierającą - (VerticalAlignment) verticalAlignment; oraz - (void) setVerticalAlignment: (VerticalAlignment) wartości funkcji, ponieważ zmienną jest @właściwość. Jest syntetyzowany i zawiera akcesory.
felixwcf
mam tu kilka poprawek w metodzie: "textRectForBounds" - result = CGRectMake (rect.origin.x, bounds.origin.y, rect.size.width, rect.size.height); Aby moje prace były UILable rightAlignment.
g212gs
50

Znalazłem rozwiązanie wykorzystujące AutoLayout w StoryBoard.

1) Ustaw liczbę wierszy na 0 i wyrównanie tekstu do lewej.

wprowadź opis obrazu tutaj

2) Ustaw ograniczenie wysokości.

wprowadź opis obrazu tutaj

3) Ograniczenie wysokości powinno być w relacji - mniejsze niż lub równe

wprowadź opis obrazu tutaj

4)

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

Wynik otrzymałem następująco:

wprowadź opis obrazu tutaj

AG
źródło
2
Działa jak urok, nawet w UITableViewCell z ponownym użyciem.
alex.bour
Czy umieszczasz viewWillLayoutSubviewsw kontrolerze czy w pliku komórki? Jeśli kontroler, w jaki sposób uzyskuje dostęp do UILabel z komórki?
Craig Pearce
Gdzie umieszczasz krok 4? Jako nowy użytkownik byłem podekscytowany, że mam rozwiązanie oparte wyłącznie na interfejsie użytkownika, a potem ten kod pojawia się znikąd i nie powiedziano nam, gdzie go umieścić
velkoon
Albo na SampleClass.swift lub SampleTableViewCell.swift
AG
To powinno być rozwiązanie. Działa doskonale, nie wymaga hakowania ani podklas.
Ciekawy 101,
45

SOLabel działa dla mnie.

Swift 3 i 5:

Ta wersja została zaktualizowana w stosunku do oryginału, aby umożliwić obsługę języków 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
źródło
Jeśli spróbuję utworzyć etykietę za pomocą tego kodu: var myLabel = VerticalAlignLabel () otrzymuję komunikat „Brak argumentu dla parametru„ koder ”w wywołaniu”. Jak mogę utworzyć etykietę przy użyciu tej podklasy VerticalAlignLabel?
RanLearns
1
Wypróbuj teraz Swift w wersji 3 - miałem wymagany init, który nie jest potrzebny.
totiG
14

W moim przypadku była to bottom spacekwestia ograniczeń. Ustawiłem to = 16.

Kiedy ustawiłem to bottom to >= 16, problem został rozwiązany.

Ponadto, jeśli masz jakiekolwiek ograniczenie wysokości na etykiecie, musisz je usunąć.

Oto widok ograniczeń mojej etykiety w Inspektorze rozmiaru:

przymus

Mukesh Chapagain
źródło
Nie mam opcji wiązania, kiedy wybieram etykietę.
velkoon
Najprostsza poprawka - pozwól ograniczeniom i automatycznemu układowi zająć się tym. Dzięki!
Jason
13

W twoim kodzie

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

Uważaj, jeśli użyjesz tego w komórkach tabeli lub innych widokach, które zostaną odtworzone z różnymi danymi, musisz gdzieś przechowywać oryginalną ramkę i zresetować ją przed wywołaniem sizeToFit.

n13
źródło
W tym momencie zalecałbym pozostawienie tego wszystkiego Autolayout. To już nie jest potrzebne.
n13
9

Znalazłem inne rozwiązanie tego samego problemu. Użyłem UITextViewzamiast UILabeli przełączyłem editable()funkcję na false.

Maxim Zh
źródło
@geekyaleks Dlaczego to głupi hack? Wydaje się, że jest to przyzwoite obejście, czy są z tym jakieś inne problemy, poza tym, że nie są bezpośrednią odpowiedzią na pytanie?
Christopher Larsen,
Nie jest to właściwe, ponieważ nie używasz odpowiedniego składnika interfejsu użytkownika do tego zadania. NIE powinno to być kompromisem w przypadku czegoś tak prostego, jak wyrównanie w pionie. Musisz użyć odpowiedniego komponentu do pracy. Wszystko inne to hack ...
geekyaleks
7

Miałem również ten problem, ale odkryłem, że kolejność, w której ustawiasz właściwości i metody UILabel, ma znaczenie!

Jeśli zadzwonisz [label sizeToFit]wcześniej, label.font = [UIFont fontWithName:@"Helvetica" size:14];tekst nie zostanie wyrównany do góry, ale jeśli zmienisz je, to tak!

Zauważyłem też, że ustawienie tekstu w pierwszej kolejności też robi różnicę.

Mam nadzieję że to pomoże.

rharvey
źródło
Wspaniały. sizeToFit () powinno zostać wywołane na końcu.
MKatleast3
4

Korzystając z konstruktora interfejsu, ustaw ograniczenia dla swojej etykiety (pamiętaj, aby ustawić również wysokość i szerokość). Następnie w Inspektorze rozmiaru sprawdź wysokość etykiety. Tam chcesz, aby czytał> = zamiast =. Następnie w implementacji dla tego kontrolera widoku ustaw liczbę wierszy na 0 (można to również zrobić w IB) i ustaw etykietę [label sizeToFit]; a wraz ze wzrostem długości tekstu etykieta będzie rosła i utrzymywał tekst w lewym górnym rogu.

TomG103
źródło
4

Jeśli potrzebujesz nieedytowalnego tekstu, który domyślnie zaczyna się w lewym górnym rogu, możesz po prostu użyć widoku tekstu zamiast etykiety, a następnie ustawić jego stan na nieedytowalny, na przykład:

textview.isEditable = false

O wiele łatwiejsze niż majstrowanie przy etykietach ...

Twoje zdrowie!

Alejandro Camus
źródło
3

Rozwiązanie z SoLabel działa, dzięki.

Poniżej dodałem wersję 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
źródło
3

Najprostszym i najłatwiejszym sposobem jest osadzenie etykiety w StackView i ustawienie osi StackView na poziomą, wyrównanie do góry w inspektorze atrybutów ze scenorysu, jak pokazano tutaj .

Baig
źródło
2

Opierając się na niesamowitej odpowiedzi totiG, stworzyłem klasę IBDesignable, która niezwykle ułatwia dostosowanie pionowego wyrównania UILabel bezpośrednio z StoryBoard. Po prostu upewnij się, że ustawiłeś klasę UILabel na „VerticalAlignLabel” z inspektora tożsamości StoryBoard. Jeśli wyrównanie w pionie nie działa, przejdź do Edytor-> Odśwież wszystkie widoki, co powinno załatwić sprawę.

Jak to działa: Po prawidłowym ustawieniu klasy UILabel scenorys powinien pokazać pole wejściowe, które przyjmuje liczbę całkowitą (kod wyrównania).

Aktualizacja: Dodałem obsługę wyśrodkowanych etykiet ~ Sev


Wprowadź 0 dla wyrównania do góry

Wprowadź 1 dla wyrównania do środka

Wprowadź 2 w polu Wyrównanie do dołu

    @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
źródło
2

możesz także po prostu zmienić UILabel na UITextView, ponieważ zasadniczo robią to samo, z wyjątkiem zalet UITextView jest to, że tekst jest automatycznie wyrównany do lewego górnego rogu

Ndamu
źródło
1

Mam ten problem, ale moja etykieta była w UITableViewCell, aw funduszu najłatwiejszym sposobem rozwiązania problemu było utworzenie pustego UIView i ustawienie w nim etykiety z ograniczeniami tylko na górze i na lewej stronie, przy wyłączonej klątwie ustaw liczbę linii na 0

Hiram Elguezabal
źródło
0

W przypadku iOS 7 to właśnie zrobiłem i pracowałem dla mnie

@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
źródło
0

Swift 2.0 :: Korzystanie z rozszerzenia UILabel

Utwórz stałe wartości wyliczenia w pustym pliku Swift.

//  AppRef.swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

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

}

Korzystanie z rozszerzenia UILabel:

Utwórz pustą klasę Swift i nazwij ją. Dodaj następujące elementy.

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

     }
    }

Stosowanie :

myMessageLabel.makeLabelTextPosition(messageLabel, positionIdentifier: UILabelTextPositions.VERTICAL_ALIGNMENT_TOP.rawValue)
AG
źródło
Czy mógłbyś wyjaśnić, do czego jest potrzebne sampleLabel: UILabel??
Craig.Pearce
W tej funkcji makeLabelTextPosition (sampleLabel: UILabel ?, positionIdentifier: String) {} musisz przekazać obiekt UILabel.
AG
0

Wersja Swift 3 odpowiedzi @ 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
źródło
0

Odpowiedź @ totiG jest poprawna i rozwiązała mój problem. Ale napotkałem problem podczas implementacji tej metody, w mniejszych urządzeniach, takich jak 5s, SE, to nie działa dla mnie. Mam do zbioru label.sizeToFit()woverride func layoutSubViews()

override func layoutSubViews() {
    super.layoutSubViews()
    // Do other works if needed
    label.sizeToFit()
}
Ankur Lahiry
źródło
0

Szybki 5

To proste, kolejność właściwości jest wszystkim.

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
źródło
-2

Jak ustawić wyrównanie do lewego górnego rogu dla aplikacji UILabel na iOS? Etykieta Ustaw tryb treści na „Lewy górny” działa dla mnie, bardzo dziękuję:
Jak ustawić wyrównanie do lewego górnego rogu dla aplikacji UILabel na iOS?  Etykieta Ustaw tryb treści na „Lewy górny” działa dla mnie, bardzo dziękuję

Mahasam
źródło
1
Nie robi dla mnie absolutnie nic. Wydaje się to intuicyjnie, że powinno być rozwiązaniem, dlatego zwróciłem się do Google, gdy to nie zadziałało (lub pozornie wszystko działa).
velkoon