2013-07-06 111 views
10

我一直在試圖兩天修改UILabel的框架,這 是荒謬的......在UILabel是一個IBOutlet,但是這是不是這個原因 爲什麼它不工作:我試圖以編程方式創建一個UILabel和 它仍然沒有工作。下面是我如何做到這一點:爲什麼我不能更改我的UILabel的框架?

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; 

我已經問上IRC,他們告訴我,有什麼理由 框架不會改變......

我也嘗試創建一個框架與CGRectMake並給它任意 值,但這並沒有伎倆要麼..

有誰知道可能是什麼問題,請?

編輯1:我記錄的幀之前和之後,我得到了奇怪的結果:

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

高度後,我設定的框架是唯一有意義的值(我有很多的文字標籤上的目的)。

編輯2:我改變了代碼如下,日誌說 改變了,但在模擬器上它沒有改變;我通過向UILabel的圖層添加紅色 邊界來證明。

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

你之前和之後記錄了幀?你爲什麼要改變邊界(特別是使用框架,它在不同的座標空間中)? – Wain

+0

我按照你的建議前後記錄了框架,並得到了包含在我編輯的問題中的奇怪結果。 –

+1

爲什麼在最後將行數設置爲0? – Abizern

回答

26

如果您使用自動佈局,您不應該進行任何框架設置 - 要麼關閉自動佈局,要麼使用約束來更改標籤的大小。最簡單的方法是在IB中給你的標籤一個高度約束(如果你想要一個恆定的寬度,也是寬度),併爲它製作一個IBOutlet。然後,在代碼中,根據您從sizeWithFont獲取的值更改該約束的常量值:constrainedToSize:lineBreakMode :.

+0

它的工作!非常感謝!! –

+0

工作很好。如何更新約束並不明顯。這裏是你如何做到這一點:self.labelWidthContraint.constant = size.width; self.labelHeightContraint.constant = size.height; – ddiego

+0

不完全直觀,但這很好 - 感謝Delmar先生! – BonanzaDriver

0

你的標籤具有零幀開始,所以,當你這樣做:

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

你問sizeWithFont方法做一些有效不可能的 - 告訴你在沒有寬度允許的情況下需要的高度。它提供的響應(33525.000000)可能是高度,如果每行允許一個字符或類似的東西。

因此,要麼在開始之前設置標籤的寬度,要麼將允許的寬度提供給sizeWithFont方法,然後使用響應(而不僅僅是高度)設置標籤大小。

此外,請考慮通過更改邊界來嘗試做什麼。將代碼註釋掉,直到你至少得到框架爲止,然後你可以將它添加回來,並檢查它實際上是你想要的。

+0

請參閱我的最新編輯。我遵循你的建議,並在日誌框架改變,但它沒有在模擬器中做一件事... –

+0

這是唯一的代碼,你做任何事情的標籤?代碼在哪裏(它在什麼方法,什麼時候被調用)在哪裏?它有什麼自動調整大小/自動佈局規則? – Wain

+0

我從IB添加了UILabel,但沒有觸及自動佈局約束。這裏是這個代碼所在的完整文件:https://gist.github.com/AzizLight/40b66b2daa2917952d6f正如你可以看到UILabel被設置在'viewDidLoad'中,這就是它... –

相關問題