2012-12-04 76 views
4

我試圖編程創建具有兩個子視圖的UILabel的容器視圖,它們的行爲如下:動態的UILabel帶比例寬度和文本驅動高度

  • 容器寬度被固定到它的父;其高度被限制以適合
  • 標籤被水平地佈置,與它們(8分)
  • 之間的標準間距的左標籤寬度是容器
  • 右標籤寬度填充的寬度的25%的標籤可用空間減去標準水平間距
  • 長文字應該在字邊界處被打破,流過多條線;兩個標籤必須垂直增長以容納長文字

我已經定義了標籤numberOfLines = 0lineBreakMode = NSLineBreakByWordWrapping

請注意,容器的大小是完全動態的;其寬度由其超視圖確定,而其高度由其子視圖(標籤)確定。標籤的大小也是動態的;它們的寬度與容器寬度成正比,它們的高度取決於文本的長度。

我已經能夠實現上面的所有內容,除了最後一項,具有以下約束(僞代碼)。 A是左邊的標籤,B是右邊的。

  • A.top == container.top
  • B.top == container.top
  • A.leading = container.leading
  • A.trailing == B.leading - 8
  • B.trailing == container.trailing
  • A == 0.25 * container.width
  • container.height> = A.height
  • container.height> = B.height

最後2個約束條件旨在將容器拉伸以適應標籤的高度,但佈局引擎似乎忽略了標籤可能爲多行的事實。也就是說,無論文本的長度如何,我都會顯示一行。

那麼我需要添加/修改/刪除哪些約束條件才能實現上述全部行爲?

+0

我會建議作出這一在它定義一個非常簡單的只有一個視圖的示範項目,並將其張貼到Dropbox的(或當量)。如果你能得到一些積分,那麼50的獎金也會在這裏得到很多關注。有兩個想法被拋棄 - 您可以要求標籤根據其當前內容調整大小(或詢問所需的大小),您可以告訴自動佈局系統重新佈局,並且如果您實現文本代表,您將知道當文字改變時。我今天沒有使用autolayout的經驗,但我正在積極地閱讀它。 –

+0

我正在開發MonoTouch。我不認爲C#演示會對大多數自動佈局大師有幫助。 :-( – lencharest

回答

0

將標籤的高度限制的優先級設置爲較低的值,並嘗試在代碼中設置約束。

+0

我已經在做代碼中的所有事情了,優先級不是問題,現有的一組約束條件是可以滿足的 – lencharest

7

爲了讓您的標籤自動調整高度,你需要做以下幾點:

  1. 組佈局限制了標籤(這是你真正做了)
  2. 設置高度低優先級的約束。它應該是情人比ContentCompressionResistancePriority
  3. 設置numberOfLines = 0
  4. 集ContentHuggingPriority高於標籤的HIGHT優先
  5. 設置preferredMaxLayoutWidth的標籤。這個值由標籤來計算其高度

例如:

self.descriptionLabel = [[[UILabel alloc] init] autorelease]; 
self.descriptionLabel.numberOfLines = 0; 
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; 
self.descriptionLabel.preferredMaxLayoutWidth = 200; 

[self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; 
[self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; 
[self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self addSubview:self.descriptionLabel]; 

NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]; 
[self addConstraints:constrs]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]]; 
[self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_([email protected])]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]]; 
+0

對我不起作用http://stackoverflow.com/questions/22172572/constraints-to-specify -when-size-is-dependent-on-multiple-subviews – Geek

+0

'preferredMaxLayoutWidth'是我的關鍵 – atulkhatri

0

確保您設置

  1. 水平和垂直內容壓縮性優先。如果您不希望標籤截斷其內容,請將其設置爲1000.i.e. required
  2. 內容擁抱優先。看看這answer瞭解它是如何工作的。