2013-03-08 104 views
0

我有以下情況:忽略自動版式隱藏的UILabel

  1. 我使用的自動佈局
  2. 我有一個UITableViewCell,其中包含的信息,文本UILabel。下面這UILabel是像uilabel「價格變化」其他用戶界面元素(見第二畫面)和其它元件等的按鈕(圖中未示出)
  3. 由於信息文本uilabel是高度動態的,元件下方是根據信息文本標籤的高度垂直向下移動。
  4. 在第一張圖片中,您可以看到一條水平線。如果信息標籤的高度增長,這條水平線會垂直向下移動。 「價格變化」標籤根據此水平線的位置垂直對齊。

這工作正常。如果信息文本增長,其他元素按照希望向下移動。

enter image description here

現在我的問題:有時信息標籤和水平分隔符需要被隱藏,因爲沒有信息文本。不幸的是,uilabel下的元素仍然被標籤的高度向下移動,雖然它是隱藏的。看到我的照片的右側。元素應該向上移動紅色豎線標記的量。

如何告訴元素「價格變化」等等,如果信息標籤和「需求」標籤被隱藏,它應該向上移動。

enter image description here

更新:

我現在加了兩個NSLayoutContstraints我的代碼,並在故事板它們連接到創建的約束(看一看第三畫面)

enter image description here

好的,這裏有一個解釋:我有兩個NSLayoutConstraints 1rst:horizo​​ntalSeparatorContstraint將「Price Changes in」標籤與第一個水平分隔符UIImage視圖。我將該值設置爲4個單位,以便如果隱藏「需求」和「特殊請求標籤」,則此約束應該生效,並且「價格變化在」標籤向上移動。 第二個約束:requiresLabelContstraint - 這個描述了第二個水平UIImageView和「Price changes in」標籤之間的空間。差距應該是4個單位。如果特殊請求文本可用,這個約束應該是「活動的」。

下面是一些新的代碼:

if(tour.specialRequests.length > 0) { 
    [demandsLabelContstraint setPriority:UILayoutPriorityDefaultHigh]; 
    [horizontalSeparatorContstraint setPriority:UILayoutPriorityDefaultLow]; 

    self.demandsLeftLabel.text = NSLocalizedString(@"GenericTour_Demands", @""); 
    self.demandsRightLabel.text = tour.specialRequests; 

    demandsLeftLabel.hidden = NO; 
    demandsRightLabel.hidden = NO; 
    horizontalSeparator.hidden = NO; 
} else { 
    [demandsLabelContstraint setPriority:UILayoutPriorityDefaultLow]; 
    [horizontalSeparatorContstraint setPriority:UILayoutPriorityDefaultHigh]; 

    horizontalSeparator.hidden = YES; 
    demandsRightLabel.hidden = YES; 
    demandsLeftLabel.hidden = YES; 
} 

從您可以看到代碼:我的想法是切換優先級每一種情況。如果特殊請求文本可用,則通過設置優先級觸發相應的NSLayoutContraints。

我對Autolayout的意圖或理解是,通過改變優先級,我可以在它們之間切換。但這似乎並非如此。

那麼我該如何解決我的問題。

回答

0

如果添加IBOutlet,即使在Interface Builder中創建的約束也能以編程方式添加和刪除約束。

因此,您可以爲與信息標籤和水平分隔符相關的約束添加IBOutlet,然後當它們被隱藏時,可以刪除這些約束並在再次顯示標籤時將它們放回。

你會再補充一點,在每當信息標籤隱藏起來,價格變化標籤將被正確連接

有一個視頻在頂部的價格變動標籤鏈接到水平分離裝置一個新的約束WWDC 2012解釋如何做這樣的事情,我認爲這是掌握自動佈局的最佳實踐

+0

謝謝你的答案。我更新了我的問題。 – toom 2013-03-15 18:14:20