Bagaimana cara mengatur perataan kiri atas untuk UILabel untuk aplikasi iOS?

99

Saya telah menambahkan satu label di file ujung pena saya, lalu diperlukan perataan kiri atas untuk label itu. Karena saya menyediakan teks saat runtime jadi tidak yakin berapa banyak baris yang ada. Jadi jika teks hanya berisi satu baris, maka teks tersebut muncul sebagai rata tengah vertikal. Penjajaran itu tidak sesuai dengan label saya masing-masing di depannya.

Sebagai contoh:

masukkan deskripsi gambar di sini

Yang terlihat aneh :(

Apakah ada cara untuk menyetel teks label ke kanan atas perataan?

Mrunal
sumber
kemungkinan duplikat teks rata vertikal dalam UILabel
HDdeveloper

Jawaban:

62

Daripada menjelaskan ulang, saya akan menautkan ke pertanyaan / jawaban yang agak ekstensif & berperingkat tinggi ini:

Ratakan teks secara vertikal ke atas dalam UILabel

Jawaban singkatnya adalah tidak, Apple tidak membuat ini mudah, tetapi dimungkinkan dengan mengubah ukuran bingkai.

shawnwall.dll
sumber
64

Ini cukup mudah dilakukan. Buat UILabelsublcass dengan verticalAlignmentproperti dan timpa textRectForBounds:limitedToNumberOfLinesuntuk mengembalikan batas yang benar untuk perataan vertikal atas, tengah, atau bawah. Berikut kodenya:

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
sumber
3
Saya juga mencoba banyak solusi lain di sini di SO sebelum menjalankan yang satu ini. Ini bekerja dengan sempurna! Perlu diingat bahwa jika Anda melakukan ini di StoryBoard, pastikan Anda menyetel atribut CustomClass ke SOLabel (atau apa pun yang Anda putuskan untuk menamainya), bukan UILabel (di Utilities Inspector).
TMc
Ini sangat membantu, terima kasih. Ini tidak berfungsi untuk teks rata tengah atau kanan, tetapi menggunakan bounds.size.widthalih-alih rect.size.widthdalam textRectForBounds:limitedToNumberOfLines:tampaknya memperbaikinya.
Geoff Hackworth
1
Jika Anda menemukan 'Thread 1: EXC_BAD_ACCESS (Code 2, address = 0x ...)' di iOS 9 Xcode 7, Cukup hapus setter dan getter - (VerticalAlignment) verticalAlignment; dan - (void) setVerticalAlignment: fungsi nilai (VerticalAlignment), karena variabelnya adalah @property. Ini disintesis dan berisi pengakses.
felixwcf
saya telah melakukan beberapa amandemen di sini dalam metode: "textRectForBounds" - result = CGRectMake (rect.origin.x, bounds.origin.y, rect.size.width, rect.size.height); Untuk membuat karya saya untuk rightAlignment UILable.
g212gs
50

Saya menemukan solusi menggunakan AutoLayout di StoryBoard.

1) Atur tidak ada baris ke 0 dan perataan teks ke Kiri.

masukkan deskripsi gambar di sini

2) Tetapkan batasan tinggi.

masukkan deskripsi gambar di sini

3) Batasan tinggi harus dalam Relasi - Kurang Dari atau Sama

masukkan deskripsi gambar di sini

4)

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

Saya mendapatkan hasil sebagai berikut:

masukkan deskripsi gambar di sini

AG
sumber
2
Bekerja seperti pesona, bahkan dalam UITableViewCell dengan penggunaan kembali.
alex.bour
Apakah Anda menempatkan viewWillLayoutSubviewsdi pengontrol atau file sel? Jika pengontrol, bagaimana cara mengakses UILabel dari sel?
Craig.Pearce
Di mana Anda meletakkan langkah 4? Sebagai pengguna baru, saya sangat senang memiliki solusi UI murni, lalu kode itu muncul entah dari mana dan kami tidak diberi tahu di mana harus meletakkannya
velkoon
Baik di SampleClass.swift atau SampleTableViewCell.swift
AG
Ini harus menjadi Solusinya. Bekerja dengan sempurna, tidak perlu peretasan atau subclass.
Curious101
44

SOLabel bekerja untuk saya.

Swift 3 & 5:

Versi ini telah diperbarui dari aslinya untuk memungkinkan dukungan untuk bahasa 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)
    }
}

Cepat 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
sumber
Jika saya mencoba membuat label menggunakan kode ini: var myLabel = VerticalAlignLabel () Saya mendapatkan "Argumen yang hilang untuk parameter 'coder' dalam panggilan". Bagaimana cara membuat label menggunakan subkelas VerticalAlignLabel ini?
RanLearns
1
Coba Swift versi 3 sekarang - Saya memiliki init wajib yang tidak diperlukan.
totiG
14

Dalam kasus saya, itu adalah bottom spacemasalah kendala. Saya telah mengaturnya ke = 16.

Ketika saya mengaturnya ke bottom to >= 16, masalah ini terpecahkan.

Selain itu, jika Anda memiliki batasan ketinggian di label, Anda harus menghapusnya.

Berikut tampilan batasan label saya di size inspector:

paksaan

Mukesh Chapagain
sumber
Saya tidak memiliki opsi Batasan saat memilih label.
velkoon
Perbaikan paling sederhana - biarkan kendala dan tata letak otomatis menanganinya. Terima kasih!
Jason
13

Dalam kode Anda

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

Berhati-hatilah jika Anda menggunakannya dalam sel tabel atau tampilan lain yang didaur ulang dengan data berbeda, Anda harus menyimpan bingkai asli di suatu tempat dan menyetel ulang sebelum memanggil sizeToFit.

n13
sumber
Saya akan merekomendasikan untuk menyerahkan semuanya ke Autolayout pada saat ini. Ini tidak diperlukan lagi.
n13
9

Saya menemukan solusi lain untuk masalah yang sama. Saya menggunakan UITextViewalih-alih UILabeldan beralih editable()fungsi ke false.

Maxim Zh
sumber
@geekyaleks Mengapa ini adalah peretasan bodoh? Sepertinya solusi yang layak, apakah ada masalah lain selain tidak menjadi jawaban langsung untuk pertanyaan tersebut?
Christopher Larsen
Ini tidak sesuai, karena Anda tidak menggunakan komponen UI yang sesuai untuk pekerjaan itu. Ini seharusnya TIDAK menjadi kompromi untuk sesuatu yang sederhana seperti perataan vertikal. Perlu menggunakan komponen yang tepat untuk pekerjaan itu. Ada lagi yang meretas ...
geekyaleks
7

Saya juga mengalami masalah ini tetapi yang saya temukan adalah urutan pengaturan properti dan metode UILabel yang penting!

Jika Anda menelepon [label sizeToFit]sebelumnya label.font = [UIFont fontWithName:@"Helvetica" size:14];maka teks tidak sejajar dengan bagian atas tetapi jika Anda menukar mereka, maka itu benar!

Saya juga memperhatikan bahwa mengatur teks terlebih dahulu membuat perbedaan juga.

Semoga ini membantu.

rharvey.dll
sumber
Bagus. sizeToFit () harus dipanggil paling akhir.
MKatleast3
4

Saat Anda menggunakan pembuat antarmuka, setel batasan untuk label Anda (pastikan untuk menyetel tinggi dan lebar juga). Kemudian di Size Inspector, periksa tinggi untuk labelnya. Di sana Anda akan menginginkannya untuk membaca> = bukannya =. Kemudian dalam implementasi untuk pengontrol tampilan tersebut, setel jumlah baris ke 0 (juga dapat dilakukan di IB) dan setel label [label sizeToFit]; dan saat teks Anda bertambah panjang, label akan bertambah tinggi dan teks Anda tetap berada di kiri atas.

TomG103
sumber
4

Jika yang Anda butuhkan adalah teks yang tidak dapat diedit yang secara default dimulai di sudut kiri atas Anda cukup menggunakan Tampilan Teks sebagai ganti label dan kemudian mengatur statusnya menjadi tidak dapat diedit, seperti ini:

textview.isEditable = false

Jauh lebih mudah daripada mengotak-atik label ...

Bersulang!

Alejandro Camus
sumber
3

Solusi dengan SoLabel berhasil, Terima kasih.

Di bawah ini saya telah menambahkan versi 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
sumber
3

Cara termudah dan termudah adalah dengan menyematkan Label di StackView dan mengatur Axis StackView ke Horizontal, Alignment to Top di Attribute Inspector dari Storyboard seperti yang ditunjukkan di sini .

Baig
sumber
2

Membangun di atas jawaban mengagumkan totiG, saya telah membuat kelas IBDesignable yang membuatnya sangat mudah untuk menyesuaikan perataan vertikal UILabel langsung dari StoryBoard. Pastikan Anda menyetel kelas UILabel Anda ke 'VerticalAlignLabel' dari inspektur identitas StoryBoard. Jika perataan vertikal tidak berpengaruh, buka Editor-> Segarkan Semua Tampilan yang seharusnya melakukan trik.

Cara kerjanya: Setelah Anda mengatur kelas UILabel Anda dengan benar, storyboard akan menampilkan bidang input yang mengambil integer (kode penyelarasan).

Pembaruan: Saya telah menambahkan dukungan untuk label terpusat ~ Sev


Masukkan 0 untuk Perataan Teratas

Masukkan 1 untuk Perataan Tengah

Masukkan 2 untuk Alignment Bawah

    @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
sumber
2

Anda juga dapat mengubah UILabel Anda menjadi UITextView, karena mereka pada dasarnya melakukan hal yang sama kecuali keuntungan dari UITextView adalah teks secara otomatis diratakan ke kiri atas

Ndamu
sumber
1

Saya memiliki masalah ini tetapi label saya ada di UITableViewCell, dan dengan dana itu cara termudah untuk menyelesaikan masalah adalah dengan membuat UIView kosong dan mengatur label di dalamnya dengan batasan ke atas dan ke sisi kiri saja, tanpa kutukan setel jumlah baris menjadi 0

Hiram Elguezabal
sumber
0

Untuk iOS 7 itulah yang saya buat dan bekerja untuk saya

@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
sumber
0

Swift 2.0 :: Menggunakan Ekstensi UILabel

Buat nilai enum konstan dalam file Swift yang kosong.

//  AppRef.swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

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

}

Menggunakan Ekstensi UILabel:

Buat kelas Swift kosong dan beri nama. Tambahkan yang berikut ini.

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

     }
    }

Penggunaan:

myMessageLabel.makeLabelTextPosition(messageLabel, positionIdentifier: UILabelTextPositions.VERTICAL_ALIGNMENT_TOP.rawValue)
AG
sumber
Bisakah Anda menjelaskan apa yang dibutuhkan sampleLabel: UILabel??
Craig.Pearce
Pada func makeLabelTextPosition ini (sampleLabel: UILabel ?, positionIdentifier: String) {}, Anda harus meneruskan objek UILabel.
AG
0

Jawaban @ totiG versi Swift 3

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
sumber
0

Jawaban @ totiG benar dan menyelesaikan masalah saya. Tetapi saya menemukan masalah saat menerapkan metode ini, di perangkat yang lebih kecil seperti 5s, SE, ini tidak berhasil untuk saya. Saya harus set label.sizeToFit()dioverride func layoutSubViews()

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

Cepat 5

Sederhana saja, urutan properti adalah segalanya.

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.dll
sumber
-2

Bagaimana cara mengatur perataan kiri atas untuk UILabel untuk aplikasi iOS? Label Setel Mode Konten ke "Kiri Atas" berfungsi untuk saya, terima kasih banyak:
Bagaimana cara mengatur perataan kiri atas untuk UILabel untuk aplikasi iOS?  Label Setel Mode Konten ke "Kiri Atas" berfungsi untuk saya, terima kasih banyak

mahasam
sumber
1
Tidak apa-apa untukku. Ini tampaknya secara intuitif seperti itu seharusnya menjadi solusi, itulah sebabnya saya beralih ke Google ketika tidak berhasil (atau tampaknya melakukan jack semua, dalam hal ini).
velkoon