是否有任何編程方式來臨時禁用自動佈局約束?我不想在一段時間內考慮這個約束,直到我再次需要它爲止。以編程方式禁用自動佈局約束
回答
您使用NSView
的removeConstraint:
;如果你創建的界面生成器約束你通過IBOutlet
class MyView : NSView {
@IBOutlet var temporaryConstraint : NSLayoutConstraint!
var constraint : NSLayoutConstraint! = nil /* my strong link */
var constraintShowing : Bool
func awakeFromNib() {
constraint = temporaryConstraint
}
func toggleLayoutConstraint(sender : AnyObject) ->() {
if constraintShowing {
self.removeConstraint(constraint)
} else {
self.addConstraint(constraint)
}
constraintShowing = !constraintShowing
}
}
有點像舞蹈,我們曾經有過在10.4天NSTableColumns
做可以把它們隱藏之前將其連接到代碼。
你也可以做一個小的控制器小工具
class ConstraintController {
var constraint : NSLayoutConstraint
var view : NSView
var show : Bool {
didSet {
if show {
view.addConstraint(constraint)
} else {
view.removeConstraint(constraint)
}
}
}
init (c : NSLayoutConstraint, inView : NSView) {
constraint = c
view = inView
show = true
}
}
class MyView : NSView {
@IBOutlet var temporaryConstraint : NSLayoutConstraint!
var control : ConstraintController? = nil
func awakeFromNib() ->() {
control = ConstraintController(temporaryConstraint, inView: self)
}
func show(sender : AnyObject!) ->() {
control!.show
}
func hide(sender : AnyObject!) ->() {
control!.hide
}
}
更多行,但無疑更容易理解和更小的hackish。
所以你只是保持對約束對象的引用,同時從視圖中刪除它?有沒有更乾淨的方式來做到這一點,如.enabled屬性? – TheNotSoWise 2014-09-24 17:22:37
我在想你可以寫一點控制器/包裝類... – iluvcapra 2014-09-24 17:23:50
嘿,我會如果我沒有明顯的選擇。看起來這是應該已經存在的功能。 – TheNotSoWise 2014-09-24 17:25:13
在開發iOS 8.0或更高版本時,只需在創建IBOutlet後使用isActive
屬性NSLayoutConstraint
即可。
修訂
- 有強引用按照以下建議出口,謝謝@rob mayoff。
- 使用.isActive而不是.active使用Swift 4以下的建議,謝謝@Mohit Singh。
你的電池將具有以下出口:
@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
,你將訪問限制在willDisplayCell
,如:
myCell.photoBottomConstraint.isActive = false
,當你再次需要它:
myCell.photoBottomConstraint.isActive = true
如果您想稍後重新激活約束條件,您可能需要聲明出口'strong'(或者因爲'strong'是默認值,所以不要放棄'weak')。當禁用約束時,視圖不再引用它,如果在某處沒有強引用,它將被解除分配,並且「弱」插座將被設置爲零。 – 2016-04-12 01:49:19
愛與迅速工作 – 2016-06-29 11:53:05
真的很棒的答案..保存一天。大 – 2016-11-14 06:46:09
基於oyalhi的回答,也想指出你必須作出強烈參考您的約束,如果你想使之失去活性:
@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
它不是abvious,但如果你使用弱引用,photoBottomConstraint
可能是零此調用後:
myCell.photoBottomConstraint.active = false
- 1. 以編程方式使用自動佈局約束條件
- 2. 調試編程自動佈局約束
- 3. 約束佈局 - 以編程方式設置指南的方向
- 4. 約束佈局改變約束編程
- 5. 如何在約束佈局中以編程方式實現layout_constraintEnd_toEndOf?
- 6. 如何以編程方式創建約束佈局
- 7. ios6自動佈局約束
- 8. iOS自動佈局約束
- 9. 熱添加視圖以滾動型編程方式使用佈局約束
- 10. 如何以編程方式爲UITextView設置自動佈局約束對於通用應用程序使用swift
- 11. 不使用自動佈局的約束?
- 12. 自動佈局約束不起作用
- 13. 如何以編程方式禁用主鍵約束?
- 14. 如何以編程方式禁用約束?
- 15. 以編程方式使用約束或相對大小的Swift佈局
- 16. android編程中的約束佈局
- 17. 以編程方式添加約束
- 18. 以編程方式設置約束
- 19. 如何更改自動佈局約束
- 20. Swift:Mask Alignment +自動佈局約束條件
- 21. 自動佈局約束拋出異常
- 22. 自動佈局約束不工作
- 23. ios自動佈局約束問題
- 24. 自動佈局約束和CALayer問題
- 25. 自動佈局約束不受重視
- 26. 自動佈局約束不正確?
- 27. 約束uitableview和uiview自動佈局
- 28. Android的約束佈局內滾動型約束佈局
- 29. 相對佈局。約束方程解釋
- 30. 如何以編程方式在約束佈局中添加視圖?
在10.10中,'NSLayoutConstraint'獲得了一個'active'屬性,可以設置爲false來禁用它。將其設置爲true可啓用它。 – 2014-09-24 17:52:28
@KenThomases我也看到了這個,但是當我將'active'設置爲'false'後,約束沒有被禁用。有沒有任何示例代碼?我試圖找到一些關於此的樣本或博客,我只是找不到任何。 – 2015-12-21 12:50:32