2013-02-24 17 views
15

Aşağıdaki kodun, bir butonun ardından bir çok satırlı etiketle sonuçlanması gerektiğini düşünüyorum, ancak, düzeninden sonra, etiketin gösterileceği tek bir satır var. Amacı yenmek için dikey düzende belirgin bir yükseklik koyabilirken. Hangi diğer kısıtlamalara başvurmam gerektiği hakkında bir fikrin var mı?iOS: multiline uilabel sadece autolayout ile bir satır gösterir

UILabel *lbExplain = [[UILabel alloc] init]; 
lbExplain.text = @"The Sync process allows you to synchronize your library between different devices. By clicking on the button below you can find other devices to sync with. The other device also has to be running this applicaton."; 
lbExplain.lineBreakMode = NSLineBreakByWordWrapping; 
lbExplain.numberOfLines = 0; 
lbExplain.translatesAutoresizingMaskIntoConstraints = NO; 

UIButton *btnPartner = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btnPartner setTitle:@"Look for Partners" forState:UIControlStateNormal]; 
[btnPartner addTarget:self action:@selector(findPartners:) forControlEvents:UIControlEventTouchUpInside]; 
btnPartner.translatesAutoresizingMaskIntoConstraints = NO; 

[self.view addSubview:lbExplain]; 
[self.view addSubview:btnPartner]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[lbExplain]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lbExplain)]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[lbExplain]-[btnPartner]" options:NSLayoutFormatAlignAllLeft metrics:nil views:NSDictionaryOfVariableBindings(lbExplain, btnPartner)]]; 
+0

Etikette '-sizeToFit 'i çağırırsanız ne olur? –

+0

Fark yaratmaz. – ckh

+0

Eksik olanı elimde göremiyorum. Temelde IB'de aynı şeyi yaparsanız, iyi çalışır. – rdelmar

cevap

37

satırı ekleyin: Burada

@"V:|-[lbExplain(==300)]-[btnPartner(==200)]" 
görsel biçim diline belgelerdir orada ayarlarsanız etiket doğru şekilde genişler. Aktardığınız sayı, dikey olarak nasıl genişlediğiyle ilgili önemli gibi görünüyor, ancak genişlik için ayarladığınız kısıtlamaları geçersiz kılmaz. Edit sonra

:

Ben updateViewConstraints bu satırı ekleyin ve görünümün sınırları numarayı bağlantılıysa bu daha iyi çalışır. Bu şekilde rotasyonda uygun şekilde ayarlanır.

-(void)updateViewConstraints { 
    [super updateViewConstraints]; 
    lbExplain.preferredMaxLayoutWidth = self.view.bounds.size.width - 40; 
} 
+0

Teşekkürler! Aslında neden işe yaramış olsa da gerçekten işe yarıyor mu? 280 sadece bir sihirli numara gibi görünüyor ama hem iPad hem de iphone için çalışıyor (tabi ki ipad 280'den daha geniş). – ckh

+0

Dönebilir olsanız bile, gerçekten iPad üzerinde çalışıyor mu? 280, ayarladığınız taraflara iki 20 nokta boşluğu (varsayılan) eksi 320'dir. IPhone'daki rotasyonda, etiketin metnin üstünde ve altında boşluklarla bittiğini fark ettim. – rdelmar

+0

@ckh, düzenlememe bakın, bence bu daha iyi bir yol. – rdelmar

0

Belirsiz bir düzeniniz olmadığından emin misiniz?

Eğer

if ([self.view hasAmbiguousLayout]) { 
    NSLog(@"ambiguous"); 
} 

gibi kodunuzda bir test yapmak veya simülatör veya test cihazda duraklama yapmak ve konsol yazabilirsiniz

: eğer öyleyse

po [[UIWindow keyWindow] _autolayoutTrace] 

mi yapmak denemek ister misin olabilir senin contraints gibi daha açık bir bit (ilk bakışta, yükseklik belirsiz):

@"V:|-[lbExplain]-[btnPartner]-|" 

veyaçünkü

lbExplain.preferredMaxLayoutWidth = 280; 

Bu IB otomatik olarak yapılır şey olması gerekir:

http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html

+0

OP'nin kısıtlamaları belirsizdir, çünkü etiketler ve düğmeler içsel bir yüksekliğe sahiptir. İkinci öneriniz için, kaçınmaya çalıştığı şey budur (açık bir yükseklik ayarı). – rdelmar

+0

A “UILabel” sadece bir satır olduğunda içsel bir boyuta sahiptir. –

1

Buradaki sorun, preferredMaxLayoutWidth'un ayarlanmadığıdır. Sonuç olarak, metin herhangi bir genişlikle sınırlı değildir ve bu nedenle bir sonraki satıra sarılmaz.

Ben kolay yolu autoLayout ile satırlı UILabel bir alt oluşturmaktır kullanmak fark ettik:

@interface MyMultilineLabel : UILabel 

@end 


@implementation MyMultilineLabel 

- (void)setBounds:(CGRect)bounds { 
    [super setBounds:bounds]; 
    CGFloat width = CGRectGetWidth(bounds); 
    if (self.preferredMaxLayoutWidth != width) { 
     self.preferredMaxLayoutWidth = width; 
    } 
} 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.lineBreakMode = NSLineBreakByWordWrapping; 
     self.numberOfLines = 0; 
    } 
    return self; 
} 

@end 
0

Ben benzer bir sorun vardı nerede AutoLayout ile konumlandırılmış bir UITableViewCell bir satırlı etiket, kendini genişletmezdi.

Bu UITableViewAutomaticDimension ve estimatedHeightForRowAtIndexPath yöntemle boyutları 'otomatik olarak' kullanım bir UITableView içinde oldu.Sadece hücreyi dönmeden önce, cellForRowAtIndexPath yöntemde

[cell layoutIfNeeded] 

:

Ben arayarak bu sorunu anladım (Ben sorunun kaynağı olabileceğini düşünüyorum).

Ve bir cazibe gibi çalıştı!