2016-05-13 42 views
1

我在我的應用程序中在左側有一個UITextField,右側有一個UIButton。文本框位於超級視圖的左側(容器視圖)和按鈕的右側。 所以在文本框的左邊有一個iOS:同時更新約束和框架

前導間隔= 0在容器的關係

和右側按鈕

的關係的

尾隨空間= 0

但如果我按正確的方式移動按鈕,更改x原點值,爲什麼文本字段不放大其寬度?

(顯然按鈕具有其左右寬度和高度與用於位置約束,但不是說鎖定文本框)

所以如果我這樣做

self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height); 

按鈕在正確的方向移動,但textfield似乎不會放大其寬度。 你知道爲什麼嗎?

+0

做到這一點其他方式給textfield一個寬度約束,並以編程方式更改它 –

回答

0

你能嘗試動畫按鈕的尾部約束?

像這樣(我改變了約束爲了說明一個動畫塊內):

UIView.animateWithDuration(
    5.0, 
    animations: { 
     self.buttonTrailingMarginConstraint.constant = 0 
     self.view.layoutIfNeeded() // Necessary when changing constraints. 
    } 
) 

最終結果:

Example

的Git克隆項目:https://github.com/backslash-f/animating-constraints

2

同時使用自動佈局和程序化定位/尺寸可能會造成很多麻煩。部分原因是因爲您在自動佈局中創建了約束條件,這些約束條件基本上是您的應用在佈置所有視圖時必須遵循的「規則」,並且當您更改框架,邊界或中心屬性時,可能會使這些規則無效。但是由於自動佈局並不是經常重新計算視圖的佈局,所以直到佈局重新計算被觸發時,問題纔可能被忽視。

所以要回答你的問題,改變按鈕的框架不會改變文本,因爲自動佈局不知道任何東西已經改變。另外,您還沒有更改按鈕上的約束條件,因此如果您在文本字段和按鈕上撥打- (void) setNeedsUpdateConstraints,則您所尋找的更改不會發生。按鈕將移回到它的初始位置,這是您用約束條件設置的位置。

您可能想要做的就是創建一個IBOutlet,控制按鈕在x軸上的位置(即它的尾部空間......如果這是您正在使用的)。 。然後不要做:

self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height); 

你可以這樣做:

self.mybuttonXconstraint.constant = self.mybuttonXconstraint.constant + 100 
[self.parentView setNeedsUpdateConstraints] 

第二行是確保自動佈局知道一個約束已經改變,它應該重新計算任何意見佈局與父母的約束有關。

這可能是你的興趣,以及 - iOS Developer Library - Auto Layout Guide