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?


Odpowiedzi:



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

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


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

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


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.


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.


@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.


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.


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!


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
}

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 .


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


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


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


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

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)

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

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

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)

-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ę


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.