2015-07-11 34 views
0

用故事板和經銷商佈局上的iOS 8的一個項目工作:刪除一個視圖的佈局約束,但保留其子視圖?

  1. 在故事板,爲這一觀點指定的約束和它的子視圖
  2. 在代碼中,以響應觸摸事件,我要改變這種觀點的通過設置幀大小

爲了使雙方1和2沒有警告的,我在做的時候第一次改變其大小,代碼如下:

[theView removeConstraints:theView.constraints]; 
theView.translatesAutoresizingMaskIntoConstraints = YES; 
theView.frame = CGRectMake(0,0,width,height); 

如果不這樣做第一線時,Xcode會抱怨了一大堆關於限制衝突,但加入這一行將會刪除其所有子視圖的約束也是如此。所以我的問題是:是否有辦法刪除這個uiview的約束條件而不是它的子視圖,比如說它上面的一個按鈕仍然想要將它的自身關聯到這個視圖的大小和位置?

+0

爲什麼您需要通過設置其框架來更改視圖的大小?我認爲避免你所描述的問題的「正確」方法是在故事板中設置ViewView的大小約束時添加IBOutlets,然後在代碼中修改這些約束。 – Gamma

+0

我這樣做,並在故事板運行代碼的時候,但現在它消除警告,佈局指南(虛線)警告顯示出來,而如果「更新幀」,其子視圖會出來的地方。大概我在這方面也是OCD :) –

回答

1

首先,你不需要通過設置框,否則什麼是保持在約束首位的點來調整視圖。你可以通過簡單地擁有一個正確的初始框架來定位。

其次,你有一個錯誤觀念有關「TO-爲誰」的約束已被應用到。

說它上面的一個按鈕仍然希望它的自我相對於這個視圖的大小和位置居中?

將位置相關約束應用於視圖時,通常將其應用於其superview。如果你想在一個view那麼約束是在view加不上subview的水平中心的subview位置的裝置。這就是爲什麼當你調用一個removeContraints:消息的觀點,位置約束已被刪除,現在你的子視圖不受任何約束。然而,寬度和高度約束被應用於子視圖本身。

爲了解決這個問題,你需要做IBOutlets爲您需要修改,而你的情況應該是寬度,高度,水平x和上約束約束;然後分別更改它們的常量值。

theView.widthConstraint.constant = newValue; 
+0

確實,我在這裏提到的錯誤概念,現在它已澄清:)。由於我只是在改變身高,IBOutlet編輯它,它的工作原理。謝謝! –

+0

@YPX歡迎:) – Gandalf