2013-07-06 13 views
10

Ben saçma bir UILabel çerçevesini değiştirmek için iki gündür çalışıyorlar ... UILabel bir IBOutlet, ama bu işe yaramıyor nedeni değil: Ben programlama yoluyla UILabel yaratmaya çalışmış ve hala çalışmıyor.UILabel'ım çerçevesini neden değiştiremiyorum?

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = self.descriptionLabel.frame; 
frame.size.height = frameHeight; 
self.descriptionLabel.frame = frame; 

CGRect bounds = self.descriptionLabel.frame; 
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0; 
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0; 
self.descriptionLabel.bounds = bounds; 
self.descriptionLabel.numberOfLines = 0; 

Zaten IRC istedi ve onlar çerçeve değiştirilemez hiçbir neden olmadığını söyledi ...

Ben de bir çerçeve oluşturmaya çalıştınız: İşte böyle yaparız CGRectMake ile ve rasgele değeri vermek ama bu hile yapmadı ..

Sorunun ne olduğunu bilen var mı?

Düzenleme 1: Ben önce ve sonra çerçeveyi açmış ve Garip sonuçlar var:

Before: 0.000000 0.000000 0.000000 0.000000 
After: 0.000000 0.000000 0.000000 33525.000000 

yükseklik ben çerçeve mantıklı gelen tek değerdir ayarladıktan sonra (ben çok bir var etiket üzerindeki metinler.

Düzenleme 2: Aşağıdaki gibi kodu değiştirdim, günlük çerçeve değiştiğini ancak simülatörde değişmediğini söylüyor; UILabel katmanına kırmızı kenarlıkları ekleyerek bunu kanıtladım. Bunu yaparken

self.descriptionLabel.text = description; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 
CGFloat frameHeight = textSize.height; 
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight); 
self.descriptionLabel.frame = frame; 

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height); 
// After: 0.000000 300.000000 320.000000 585.000000 

self.descriptionLabel.numberOfLines = 0; 
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor; 
self.descriptionLabel.layer.borderWidth = 2; 

Proof

+0

Çerçeveyi önce ve sonra kaydettiniz mi? Ve neden sınırları değiştiriyorsunuz (özellikle farklı bir koordinat alanında olan çerçeveyi kullanarak)? – Wain

+0

Çerçeveyi önerdiğin gibi önce ve sonra kaydettim ve edindiğim soruya dahil olduğumda tuhaf sonuçlar aldım. –

+1

Neden satır sayısını en sonunda 0 olarak ayarlıyorsunuz? – Abizern

cevap

26

Otomatik düzen kullanıyorsanız, herhangi bir çerçeve ayarı yapmamanız gerekir - otomatik yerleşimi kapatın ya da etiketinizin boyutunu değiştirmek için kısıtlamalar kullanın. Bunu yapmanın en kolay yolu, etiketinizi IB'de bir yükseklik kısıtlaması (ve sabit bir genişlik istiyorsanız genişlik) vermek ve bir IBOutlet yapmaktır. Ardından, kodda, bu kısıtlamanın sabit değerini, sizeWithFont: size sınırlı olanToSize: lineBreakMode :.

+0

İşe yaradı! Çok teşekkürler!! –

+0

Harika çalıştı. Kısıtlamanın nasıl güncelleneceği açık değil. İşte nasılsınız: self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

Tam olarak sezgisel değil, ama bu çok güzel çalıştı - teşekkürler Bay Delmar! – BonanzaDriver

0

Etiketiniz, başlamak için sıfır çerçeve vardır, bu yüzden:

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0] 
             constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX) 
              lineBreakMode:self.descriptionLabel.lineBreakMode]; 

Etkili imkansız bir şey yapmak sizeWithFont yöntemi soruyorsun - haber Hiçbir genişliğe izin verilmediğinde gereken yükseklik. Sağladığı cevap (33525.000000), her satırda bir karaktere izin verilse veya böyle bir şey varsa, muhtemelen yüksekliktir.Bu nedenle, ya başlamadan önce etiketin genişliğini ayarlayın ya da izin verilen genişliği sizeWithFont yöntemine verin ve ardından yanıtı kullanarak etiket boyutunu ayarlayın (yalnızca yükseklik değil).

Ayrıca, sınırları değiştirerek ne yapmaya çalıştığınızı düşünün. Çerçeveyi en azından çerçeveye ulaşıncaya kadar kodlayın, sonra tekrar ekleyebilir ve gerçekte ne istediğinizi kontrol edebilirsiniz.

+0

Lütfen son düzenlemeye bakın. Önerilerinizi takip ettim ve kayıtta çerçeve değişti ama simülatörde hiç bir şey yapmadı ... –

+0

Ve bu etiket için bir şey yapan tek kod bu mu? Bu kod nerede (hangi yöntemde ve ne zaman çağrılır)? Otomatik yeniden boyutlandırma/otomatik yerleşim kuralları nedir? – Wain

+0

UILabel'ı IB'den ekledim ve otomatik yerleşim kısıtlamalarına dokunmadım. İşte bu kodun bulunduğu tam dosya şudur: https://gist.github.com/AzizLight/40b66b2daa2917952d6f UILabel'ın 'viewDidLoad' içinde ayarlandığını görebildiğiniz gibi ve bununla ilgili ... –