3 回答

TA貢獻1852條經驗 獲得超1個贊
有可能,但是您需要做一些額外的工作。首先要解決一些概念上的問題:
隱藏的視圖(即使不繪制)仍會參與自動版式,并且通常會保留其框架,并將其他相關視圖保留在其位置。
從其超級視圖中刪除視圖時,所有相關約束也將從該視圖層次結構中刪除。
就您而言,這可能意味著:
如果將左視圖設置為隱藏,則標簽將保留在原處,因為該左視圖仍會占用空間(即使它不可見)。
如果刪除左視圖,則標簽可能會受到含糊的約束,因為標簽的左邊緣不再受約束。
您需要明智地過度約束標簽。單獨保留現有約束(到另一個視圖的空間為10pts),但添加另一個約束:以不需要的優先級使標簽的左邊緣距其超級視圖的左邊緣10pts(默認的高優先級可能會很好地工作)。
然后,當您希望它們向左移動時,請完全刪除左視圖。左側視圖的強制性10pt約束將與它所關聯的視圖一起消失,而您將只剩下一個高優先級約束,即標簽距離其父視圖至少10pts。在下一次布局傳遞時,這將導致它們向左擴展,直到它們填滿超級視圖的寬度為止,但要保持您在邊緣周圍的間距。
一個重要的警告:如果您想讓左視圖重新出現在圖片中,不僅需要將其重新添加到視圖層次結構中,而且還必須同時重新建立其所有約束。這意味著您需要一種在視圖再次顯示時將其視圖之間的10pt間距約束放回視圖的方法。

TA貢獻1810條經驗 獲得超4個贊
在運行時添加或刪除約束是一項重量級的操作,可能會影響性能。但是,有一個更簡單的選擇。
對于要隱藏的視圖,設置寬度約束。將其他視圖限制在該視圖的前導水平間隙處。
要隱藏,.constant
請將寬度約束的設置為0.f。其他視圖將自動向左移動到指定位置。

TA貢獻1765條經驗 獲得超5個贊
對于僅支持iOS 8+的用戶,有一個新的布爾屬性active。這將有助于動態地僅啟用所需的約束
PS約束出口必須強而不是弱
示例:
@IBOutlet weak var optionalView: UIView!
@IBOutlet var viewIsVisibleConstraint: NSLayoutConstraint!
@IBOutlet var viewIsHiddenConstraint: NSLayoutConstraint!
func showView() {
optionalView.isHidden = false
viewIsVisibleConstraint.isActive = true
viewIsHiddenConstraint.isActive = false
}
func hideView() {
optionalView.isHidden = true
viewIsVisibleConstraint.isActive = false
viewIsHiddenConstraint.isActive = true
}
另外,要修復情節提要中的錯誤,您需要取消Installed選中這些約束之一的復選框。
UIStackView (iOS 9+)的
另一個選擇是將視圖包裝在中UIStackView。隱藏視圖后,UIStackView將自動更新布局
- 3 回答
- 0 關注
- 751 瀏覽
添加回答
舉報