2013-04-10 69 views
14

是否有任何簡單的方法可以幫助我使用它們的內容大小動態地改變依賴視圖的位置?UILabel sizeToFit和約束條件

我想在列中顯示幾個視圖,它們都有不同的內容。而且我要他們放置了一個又一個(我已經創建了使用約束的佈局,看起來像這樣)

initial layout

但每當我更改標籤的內容和呼叫sizeToFit,系統似乎忽略佈局。

after size to fit call

目前我感興趣的只是height屬性,我知道約束矩形可太習慣,並在過去,我寫了很多的UIView類動態改變大小(我想每個人都一樣) 。但也許有一種我不知道的簡單方法?

+0

檢查此http://stackoverflow.com/a/16009707/988169。這工作得很好。 – pkc456 2015-05-25 07:46:30

回答

42

-sizeToFit如果您使用自動佈局,則不應調用。這是「舊」系統的一部分。

它看起來像IB已經在您的約束中插入了明確的高度(標籤旁邊的垂直條表示這一點)。嘗試選擇標籤並按Cmd + =清除這些。

對於多標籤,你也需要做在您的視圖控制器下面進行旋轉/縮放視圖時一切都正常工作:

- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label 
{ 
    label.preferredMaxLayoutWidth = 
     [label alignmentRectForFrame:label.frame].size.width; 
} 

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1]; 
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2]; 
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3]; 

    [self.view layoutSubviews]; 
} 

多行標籤暴露自動佈局的弱點之一。我們必須更新preferredMaxLayoutWidth以強制標籤迴流並調整其高度,否則如果視圖被調整大小/旋轉,自動佈局不會實現標籤需要重新排版和調整大小。

+0

謝謝!爲我工作(我完全刪除並創建了新的視圖,xcode似乎隱式地存儲了一些與佈局相關的數據) – asdf 2013-04-10 15:28:43

+0

是的,IB + autolayout現在有很多問題。希望蘋果能夠在未來改進它。 – 2013-04-10 17:19:15

+1

你能解釋一下你的代碼嗎,特別是使用'alignmentRectForFrame'。 – 2013-10-22 15:42:26

-1

這也適用。 https://github.com/jszumski/auto-layout-table-cells/blob/master/DynamicCellHeights/JSLabel.m

@interface JSLabel : UILabel 

@end 

@implementation JSLabel 

- (id)init { 
    self = [super init]; 

    // required to prevent Auto Layout from compressing the label (by 1 point usually) for certain constraint solutions 
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired 
              forAxis:UILayoutConstraintAxisVertical]; 

    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds); 

    [super layoutSubviews]; 
} 

@end 
2

如果你仍然想使用自動佈局約束的標籤。這是一個解決方案:

[self.lblBadgeValue sizeToFit]; 
self.constraintWidthBadgeLabel.constant = self.lblBadgeValue.frame.size.width; 
[self.lblBadgeValue needsUpdateConstraints]; 
[self.lblBadgeValue layoutIfNeeded]; 
  • 更多地解釋:
  • sizeToFit - >使標籤適合的高度,寬度與 內容吧。
  • 所以在運行時,你需要更新約束高度, 或寬度標籤
  • 之後,你需要說的編譯器知道 什麼需要更新約束。
  • 如果在約束條件下有變化,最後您需要調用 佈局。