2016-01-08 35 views
0

我嘗試在運行時使用以下代碼以編程方式關閉界面生成器中特定子視圖的自動佈局。如何在客戶端啓用自動佈局時提高uiview的高度c

[view removeConstraints:view.constraints]; 

某處有人建議要做到這一點:

如果您需要更改與汽車積極佈局視圖的高度,你需要創建一個IBOutlet您的高度約束和修改在運行時,即:

@IBOutlet weak var heightConstraint: NSLayoutConstraint! 
self.heightConstraint.constant = 200 

但我不明白這是什麼意思。

+0

不要嘗試調整視圖的大小。這不可能。相反...只嘗試調整約束。 – mohacs

回答

5

您必須添加:

[self layoutIfNeeded]; 

到你的代碼中改變了你的高度約束之後。它會刷新視圖和約束。 它只是意味着,不要刪除自動佈局,而是將其保留在視圖中,並創建一個約束來動態更改高度。

你可以按照這個tutorial瞭解如何自動佈局工作

+0

我用下面的代碼。 [myview removeConstraints:myview.constraints]; CGRect newFrame = vyview.frame; newFrame.size.height = 650; [myview setFrame:newFrame]; [self layoutIfNeeded]; myview本身包含在uiscrollview裏面,最後一行給出錯誤,我猜自己不被系統識別。 請告訴我這個問題。 –

+0

你不應該刪除實際的限制。但使用現有的並改變它programaticaly。首先,創建iboutlet約束條件,然後更改height.constant並最終使用前面提到的方法。不要刪除約束。也忘記框架。 –

+0

忘記框架屬性存在。切勿直接設置。視圖的框架是自動佈局過程的結果,而不是輸入變量。要更改框架,請更改約束。這迫使你改變你對UI的看法。不要考慮職位和規模,而應考慮規定每個視圖與其兄弟姐妹和父母相關的定位的規則。它不像CSS。 –

0

你需要設置約束值後添加。

[self layoutIfNeeded]; 
1

請閱讀並理解Apple的自動佈局文檔。

現在,如果您刪除所有約束條件,則不禁用自動佈局。

您需要引用代碼中的高度約束,並按建議對其進行修改,然後按照其他答案的建議[view layoutIfNeeded]進行修改。

如果還沒有高度限制,您還可以在運行時通過addConstraints:添加一個新的高度限制。

你能否詳細說明你錯過了什麼是你想引用的建議?

編輯: 也請注意,您提到的建議是迅速,沒有的OBJ-C,所以複製粘貼&不會做的伎倆。

編輯2

在這裏,我們走了,一個字一個字。

@IBOutlet weak var heightConstraint: NSLayoutConstraint! 
  • @IBOutlet:下面的變量聲明的價值是從界面生成器注入。通過拖放掛鉤。
  • weak:Obj-C和Swift中的關鍵字。通過賦值或使用此變量不會增加或管理引用計數。 (參見'retain-cycle'和'memory management')。
  • var:這個聲明的值在初始化後可能被重新分配。與let相反;在Swift中,變量可以被聲明爲不可變的。
  • heightConstraint:讀爲 '類型'
  • NSLayoutConstraint!:聲明的變量的類型聲明的變量
  • :的名稱。在這種情況下,可以隱式解包NSLayoutConstraint。這大致轉換爲Obj-C型NSLayoutConstraint*

現在,

self.heightConstraint.constant = 200 

是適合你時,設置上述聲明某處代碼變量不變。在這個例子中爲200

+0

我想說的是我不明白這段代碼片段的含義。 –

+0

我上面評論過,你可以請檢查並告訴我我的代碼有什麼問題。 –

+0

我更新了我的答案,包括代碼解釋的詳盡細節。你能明確你現在在理解方面存在的問題嗎? – SmokeDispenser

0
@IBOutlet weak var heightConstraint: NSLayoutConstraint! 
self.heightConstraint.constant = 200 

常數: 加入到參與該約束的相乘第二屬性的常量。

與其他屬性不同,常量可以在約束創建後進行修改。

在現有約束條件下設置常量要比刪除約束條件並添加一個與舊條件完全相同的新條件(除了具有不同的常量之外)要好得多。

+0

問題是在Obj-C,而不是在迅速。 – NSNoob

+0

在我的破折號中是一樣的。 – yang

+0

'@IBOutlet weak var heightConstraint:NSLayoutConstraint! '這不會被Obj-C識別:) – NSNoob

0

從格雷戈裏和揚現在得到幫助後,我可以一步一步解釋它。

1)將uiView的高度約束拖到.h文件中。

2)然後用一個名字來引用它,在我的情況下我使用heightConstraint。

3)使用下面的代碼來做伎倆。

_heightConstraint.constant = 650; 
[_myview layoutIfNeeded]; 
相關問題