2013-08-15 18 views
27

UILabel alttan hizalanabilir. Diyelim ki, etiketim üç satırlık metin içerebilir. Giriş metni tek satır ise, bu satır etiketin altına gelmelidir. Lütfen daha iyi bir anlayış için aşağıdaki resme bakın. Turuncu alan, etiketin tam karesidir. Aynı anda bir çizgisi vardır ve merkez hizalanmıştır. Öyleyse istediğim, kaç tane çizgiden bağımsız olarak her zaman altta hizalanmalıdır. UILabel metni aşağıdan nasıl hizalar?

enter image description here

fikirlerinizi önerin.

Teşekkür ederiz.

cevap

20

İşte o yapmanın iki yolu vardır ...

1.

İlk 0'a numberOfLines kurmak ve daha sonra contentSize ile UILabel böylece UILabel ekran arasında sizeToFit özelliğini kullanın.

yourLabel.numberOfLines = 0; 

[yourLabel sizeToFit]; 

bu bağlantıdan fazla bilgi bakınız: Vertically align text within a UILabel

2. Diğer bir seçenek ise yerine UILabel ait UITextField alıp aşağıda gibi NO için userInteractionEnabled ayarlamak için ...

[yourTextField setUserInteractionEnabled:NO]; 

ve daha sonra aşağıdaki gibi aşağıya contentVerticalAlignment özelliğini ayarlayın.

[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom]; 

GÜNCELLEME Ayrıca

, UITextField ile, birden fazla çizgiler elde edilemez. Bunun yerine UITextView kullanabilir ve userInteractionEnabled değerini NO olarak ayarlayabiliriz. Ardından, alt hizalanmış hale getirmek için aşağıdaki kodu kullanın.

CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height); 
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect); 
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}; 
+0

Zaten ilk çözümü denedim. Ama düzgün çalışmıyor. Her zaman üstte ve solda hizalanmış. Ama her zaman altta ve merkezde hizalanmalıdır. Ama ikinci çözüm çalışıyor gibi görünüyor. ikinci çözümde çoklu çizgi ne olacak? Mümkün olacak mı? – NSUserDefault

+0

bu çerçeveyi 3 satır ile 'CGRectMake (10,100,100,300)' varsayalım, o zaman sadece bir satır alırsanız o zaman 'CGRectMake (10,260,100,300)' gibi bir çerçeve ayarla, burada mantıkla bazı özel kodlar ayarla ** aksi takdirde ikinci seçenek en iyisi :) –

+0

Ya ikinci en iyisi. Denemeye ve bilmeye izin vereceğim. – NSUserDefault

0

Sen UILabel alt sınıf ve yöntemi geçersiz olabilir: Kullanmak istediğiniz rect'in ile süper drawTextInRect

- (void)drawTextInRect:(CGRect)rect 

çağrı.

+0

Ayrıca, - (CGRect) textRectForBounds: (CGRect) sınırlarını sınırlıAralıkHedefleri: (NSInteger) numberOfLines; Daha açık olabilir . – Dustin

15

Alt Sınıf UILabel

@interface Label : UILabel 

@end 

Sonra aynı sorunu vardı

@implementation Label 

- (void)drawTextInRect:(CGRect)rect 
{ 
    if(alignment == top) { 

     rect.size.height = [self sizeThatFits:rect.size].height; 
    } 

    if(alignment == bottom) { 

     CGFloat height = [self sizeThatFits:rect.size].height; 

     rect.origin.y += rect.size.height - height; 
     rect.size.height = height; 
    } 

    [super drawTextInRect:rect]; 
} 

@end 
+0

Bu aslında benim için gayet güzel çalışıyor, neredeyse hiç çaba sarf etmiyor, ve buradaki diğer çözümlerin bazılarına benzemeyen bir şey hissetmiyor. –

0

gibi drawTextInRect geçersiz kılar.

[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1]; 
0

Başka bir seçenek: bir etiket kullanmak

- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{ 
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode]; 

switch (vertAlign) { 
    case 0: // align = top 
     l.frame = CGRectMake(l.frame.origin.x, 
            l.frame.origin.y, 
            l.frame.size.width, 
            stringSize.height 
            ); 
     break; 
    case 1: // align = bottom 
     l.frame = CGRectMake(l.frame.origin.x, 
            (l.frame.origin.y + l.frame.size.height) - stringSize.height, 
            l.frame.size.width, 
            stringSize.height 
            ); 
     break; 
    case 2: // align = middle 
     // default 
     break; 
} 

l.text = text; 
} 

Ahd basit altına hizalamak için böyle yöntemini çağırın: İşte benim UILabel alt kısmındaki metni hizalamak gerçekleştirme şekli arkaplan renginiz için bunu bir originalLabel olarak adlandırıyorum ve örneğimde textLabel adlı metin için bir tane daha. Sonra yüksekliğini hesaplamak ve Y TextLabel için koordinat: ben sadece maksimum kısıtlaması için kod ve ayrıca Hatları sayısını kullanmadan benim için çalışıyor IB süper görünümüne bir alt sınırlaması ayarlayabilirsiniz

[textLabel sizeToFit]; 
int height = textLabel.frame.size.height; 
int yCoord = originalLabel.frame.origin.y + 
      originalLabel.frame.size.height - height; 
textLabel.frame = CGRectMake(originalLabel.frame.origin.x, yCoord, 
      textLabel.frame.size.width, height);