簡體   English   中英

刪除視圖時,約束會發生什么

[英]What happens with constraints when a view is removed

我的問題很簡單,但我在文檔中找不到任何信息。

從視圖層次結構中刪除視圖(或移動到另一個視圖)時,布局約束會發生什么?

例如,讓我們擁有帶有子視圖AB容器C 容器C有一些限制。 然后我們調用[A removeFromSuperview] A的約束會發生什么?

如果我們再次添加AC會發生什么?

約束被刪除。 如果再次添加A,則必須為其創建新約束,或者如果在刪除A之前保存約束,則可以將其添加回來。 當我做這樣的事情時,我為這個名為view1的視圖保存了這樣的約束:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}

由於我也有這個問題,我檢查了Apple Docs只是為了解決問題,結果證明已經刪除了約束條件。

UIView removeFromSuperview方法的文檔說明:

調用此方法將刪除引用要刪除的視圖的任何約束,或者引用要刪除的視圖的子樹中的任何視圖。

我不確定這是在去年發布原始問題時是否記錄在案,但我只是想我會分享這些信息,以防有人需要它...

但請注意,如果你有兩個獨立的父視圖A和B,以及一個子視圖C,其中C當前是A的子視圖,並且有適當的約束,那么調用[B addSubview:C]將不會清除與A相關的任何約束。和C,自動布局將開始拋出異常,因為這些約束不再與同一層次結構中的視圖相關。

在將C添加到B之前,您需要顯式調用[C removeFromSuperview]來刪除約束。

在Mac OS X上也是如此 - 我還沒有檢查iOS

當您[A removeFromSuperview]刪除[A removeFromSuperview]時也會刪除約束

它們被遺忘,再次添加A到C不會增加約束。

它們也被刪除了,你可以做一個簡單的測試。 選取一個視圖SUBVIEW並創建約束SUBVIEW的costraints,以跟隨其superview大小調整(如附加到superview邊緣)。 為此,您將SUBVIEW作為子視圖添加到此CONTAINERVIEW並添加為類似的約束:
五:| - [子視圖] - |
H:| - [子視圖] - |
這些約束應該添加到SUBVIEW superview,因此CONTAINERVIEW。
如果您通過簡單地檢查所有CONTAINERVIEW約束來刪除SUBVIEW,您可以看到兩個不再存在。

接口構建器也可以證明這個問題。 當在ViewController上拖放UIView添加約束然后刪除UIView ,可以看到藍色約束消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM