2014-02-20 84 views
2

我有一個內部UILabel的UIVIew,我希望UILabel和UIView包裝文本內容大小。 因此,我計算文字大小,並將UIView的框架和UIlabel的框架設置爲新的高度。 UIView完美調整大小,但UILabel不會調整大小。總是保持相同的尺寸。不知道爲什麼UILabel調整大小將無法正常工作

這裏是我的代碼:

[mylabel setNumberOfLines:0]; 
CGSize maximumLabelSize = CGSizeMake(mylabel.frame.size.width, 160); 
CGSize expectedLabelSize = [text sizeWithFont:mylabel.font 
             constrainedToSize:maximumLabelSize 
              lineBreakMode:mylabel.lineBreakMode]; 
CGRect newFrame = mylabel.frame; 
newFrame.size.height = expectedLabelSize.height; 
mylabel.frame = newFrame; 
mylabel.text = text; 

myView.frame = CGRectMake(myView.frame.origin.x, 
           myView.frame.origin.y, 
           myView.frame.size.width, 
           newFrame.size.height); 

PD:我改變了幀viewDidLayoutSubviews,我應該去做別的地方?

更新: 我在使用Autolayout時遇到了一些限制。我需要Autolayout,因爲我有一個導航欄和基於標籤欄的應用程序。

+0

該代碼看起來應該很好。你是否在代碼中的其他任何地方調整標籤框架,以覆蓋你在這裏做的事情? – Putz1103

+0

不是:S,我正在使用自動佈局,可能是導致問題。 – 6rod9

+0

我從來沒有使用autolayout,所以我沒有幫助。 – Putz1103

回答

4

如果您使用Autolayout,佈局約束將決定視圖的大小 - 不建議您使用Autolayout並更改視圖框架,因爲結果並不總是可預測的。

如果您只是想將UILabel設置爲UIView的大小,那麼請確保UILabel對高度和寬度的約束與UIView相同。 UILabels具有固有尺寸(標籤'應該'的尺寸)。除非另有約束,否則該標籤將始終設置爲固有尺寸。

該視圖應該對高度/寬度有一些限制。如果您在Xcode中設置了這些參數,請將IBOutlet設置到您的控制器中以獲取這些限制,並更改constant屬性。

如果你想在動畫的約束的變化,那麼你進行更改要更改的約束,然後調用

[UIView animateWithDuration:.5f animations:^{ 
    [self.view layoutIfNeeded]; 
}]; 

調用layoutIfNeeded將導致自動佈局限制進行重新評估。在動畫中調用它將動畫改變約束。

從外觀上看,你想要的是將UILabel約束爲與UIView相同的高度/寬度,並且在UIView上有一個用於高度約束的IBOutlet。將該IBOutlet上的constant屬性更改爲所需的高度,然後從動畫塊內部調用layoutIfNeeded

+0

真的很好的答案,並清除我所有的疑惑!我會嘗試約束方法,看看它是如何發展的。謝謝! – 6rod9

+0

必須刪除自動佈局,以便在通過代碼編輯尺寸時停止出現問題。 +1 – voghDev

相關問題