SORU
28 HAZİRAN 2009, Pazar


Bir UİLabel içinde dikey hizalama

İki satırlık metin için yer ile UILabel bir ben var. Metin çok kısa olduğunda, bazı durumlarda, bu metin etiketi dikey ortasında görüntülenir.

Nasıl dikey olarak her zaman UILabel başında yapılacak metin hizalama miyim?

image representing a UILabel with vertically-centered text

CEVAP
28 HAZİRAN 2009, Pazar


UILabel ama etiketin çerçeve değiştirerek aynı etkiyi elde edebilirsiniz dikey hizalama ayarlamak için bir yol yok. Benim etiketler turuncu yaptım net oluyor görebilirsiniz.

İşte bunu yapmak için hızlı ve kolay yolu:

    [myLabel sizeToFit];

sizeToFit to squeeze a label


Eğer birden fazla satır yapacak daha uzun metin ile bir etiket varsa, 0 (sıfır burada hatları sınırsız sayıda anlamına gelir) numberOfLines ayarlayın.

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

Longer label text with sizeToFit


Uzun Versiyonu

Neler olduğunu görmek için kod şirketimi yapacağım. Interface Builder bu en çok da ayarlayabilirsiniz. Benim kurulum bir Görünüm Uygulama Tabanlı Photoshop kenar boşlukları göstermek için yaptım arka plan görüntüsü (20 Puan). Etiket boyutları ile neler olduğunu görebilirsiniz çekici turuncu renk.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

sizeToFit kullanmanın bazı sınırlamalar Merkez veya sağa hizalı metin ile devreye girer. Ne olacağını burada

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

enter image description here

Etiketi hala sol üst köşesinde sabit bir büyüklükte. Bir değişken orijinal etiket genişliği kaydetmek ve sizeToFit, sonra ayarlayın veya bu sorunlarla mücadele için sabit bir genişlik ver

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

label alignment


sizeToFit ilk etiketin minimum genişlik saygı göstereceğini unutmayın. Eğer bir etiket 100 geniş ve sizeToFit çağrı ile başlar, 100 (veya biraz daha az) (muhtemelen çok uzun bir arka etiket genişliği verecektir. İstediğiniz minimum genişlik için etiket ayarlamak için yeniden boyutlandırma önce isteyebilirsiniz.

Correct label alignment by resizing the frame width

Not diğer şeyler:

Olsun lineBreakMode set nasıl bağlı saygı duyulur. NSLineBreakByTruncatingTail (varsayılan) diğer iki kesme modu (baş ve orta) sizeToFit, sonra göz ardı edilir. NSLineBreakByClipping de göz ardı edilir. NSLineBreakByCharWrapping Her zamanki gibi çalışır. Çerçeve genişliği hala en sağdaki harfi harfine uyacak şekilde daralmış.


Mark Amery Uçlar için bir düzeltme verdi ve yorum kullanarak Otomatik Düzen Şeritleri:

Eğer etiketiniz yer alan bir kalem ucu ya da film şeridi gibi bir küme olan view bir ViewController kullanan otomatik düzen, sonra da sizin koyarak sizeToFit arama viewDidLoad işe yaramaz, çünkü otomatik düzen boyutları ve pozisyonları subviews sonra viewDidLoad denir ve derhal geri etkileri sizeToFit Ara. Ancak, içinden *30 arama* 31**iş.


(Gelecek kuşaklar/referans için) benim Orijinal Cevap:

Bu sizeWithFont:constrainedToSize:lineBreakMode: çerçeve yüksekliği bir dize sığdırmak için gerekli hesaplamak için NSString yöntemi kullanır, kökeni ve genişliğini ayarlar.

Etiket eklemek istediğiniz metni kullanarak çerçeveyi yeniden boyutlandırmak. Bu şekilde hatları herhangi bir sayıda ağırlayacak.

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;

Bu sayfa aynı çözüm için farklı bir kod vardır:

discussions in apple

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bratayley

    Bratayley

    30 Aralık 2010
  • EEVblog

    EEVblog

    4 NİSAN 2009
  • thegeniuses.tv

    thegeniuses.

    11 Aralık 2006