亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

隱藏視圖時如何使用自動布局移動其他視圖?

隱藏視圖時如何使用自動布局移動其他視圖?

iOS
慕娘9325324 2019-10-23 12:58:45
我已經在IB中設計了自定義單元,將其子類化,然后將插座連接到我的自定義類。我在單元格內容中有三個子視圖:UIView(cdView)和兩個標簽(titleLabel和emailLabel)。根據每行可用的數據,有時我想在單元格中顯示UIView和兩個標簽,有時只顯示兩個標簽。我想做的是,如果我將UIView屬性設置為hidden,或者將其從超級視圖中刪除,則以這種方式設置約束,這兩個標簽將向左移動。我試圖將UIView領先約束設置為10像素的Superview(單元格內容),并將UILabels領先約束10像素的像素設置為下一個視圖(UIView)。稍后在我的代碼中-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath {...Record *record = [self.records objectAtIndex:indexPath.row];if ([record.imageURL is equalToString:@""]) {     cell.cdView.hidden = YES;}我隱藏了cell.cdView,我希望標簽向左移動,但是它們在Cell中的位置相同。我試圖從超級視圖中刪除cell.cdView,但它也不起作用。我已附上圖片以闡明我的意思。我知道如何以編程方式執行此操作,因此我沒有尋找該解決方案。我想要在IB中設置約束,并且我希望如果其他視圖被刪除或隱藏,我的子視圖將動態移動??梢栽贗B中使用自動布局執行此操作嗎?
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

有可能,但是您需要做一些額外的工作。首先要解決一些概念上的問題:

  • 隱藏的視圖(即使不繪制)仍會參與自動版式,并且通常會保留其框架,并將其他相關視圖保留在其位置。

  • 從其超級視圖中刪除視圖時,所有相關約束也將從該視圖層次結構中刪除。

就您而言,這可能意味著:

  • 如果將左視圖設置為隱藏,則標簽將保留在原處,因為該左視圖仍會占用空間(即使它不可見)。

  • 如果刪除左視圖,則標簽可能會受到含糊的約束,因為標簽的左邊緣不再受約束。

您需要明智地過度約束標簽。單獨保留現有約束(到另一個視圖的空間為10pts),但添加另一個約束:以不需要的優先級使標簽的左邊緣距其超級視圖的左邊緣10pts(默認的高優先級可能會很好地工作)。

然后,當您希望它們向左移動時,請完全刪除左視圖。左側視圖的強制性10pt約束將與它所關聯的視圖一起消失,而您將只剩下一個高優先級約束,即標簽距離其父視圖至少10pts。在下一次布局傳遞時,這將導致它們向左擴展,直到它們填滿超級視圖的寬度為止,但要保持您在邊緣周圍的間距。

一個重要的警告:如果您想讓左視圖重新出現在圖片中,不僅需要將其重新添加到視圖層次結構中,而且還必須同時重新建立其所有約束。這意味著您需要一種在視圖再次顯示時將其視圖之間的10pt間距約束放回視圖的方法。


查看完整回答
反對 回復 2019-10-23
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

在運行時添加或刪除約束是一項重量級的操作,可能會影響性能。但是,有一個更簡單的選擇。

對于要隱藏的視圖,設置寬度約束。將其他視圖限制在該視圖的前導水平間隙處。

要隱藏,.constant請將寬度約束的設置為0.f。其他視圖將自動向左移動到指定位置。


查看完整回答
反對 回復 2019-10-23
?
POPMUISE

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將自動更新布局


查看完整回答
反對 回復 2019-10-23
  • 3 回答
  • 0 關注
  • 751 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號