是否有任何編程方式來臨時禁用自動佈局約束?我不想在一段時間內考慮這個約束,直到我再次需要它爲止。以編程方式禁用自動佈局約束
回答
您使用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. ios自動佈局:以編程方式設置寬度約束
- 2. 以編程方式設置自動佈局約束
- 3. 訪問自動佈局約束編程
- 4. 調試編程自動佈局約束
- 5. 以編程方式使用約束來佈局多個視圖
- 6. 約束佈局 - 以編程方式設置指南的方向
- 7. 約束佈局改變約束編程
- 8. 以編程方式自動佈局
- 9. UICollectionViewCell以編程方式自動佈局
- 10. 如何以編程方式更改約束佈局的子視圖的約束
- 11. 以編程方式創建佈局約束條件
- 12. 如何以編程方式創建約束佈局
- 13. 如何在約束佈局中以編程方式實現layout_constraintEnd_toEndOf?
- 14. iOS自動佈局約束
- 15. ios6自動佈局約束
- 16. 熱添加視圖以滾動型編程方式使用佈局約束
- 17. 使用期自動佈局約束編程
- 18. 如何以編程方式爲UITextView設置自動佈局約束對於通用應用程序使用swift
- 19. 不使用自動佈局的約束?
- 20. 自動佈局約束不起作用
- 21. 如何以編程方式禁用主鍵約束?
- 22. 如何以編程方式禁用約束?
- 23. 以編程方式使用約束或相對大小的Swift佈局
- 24. 以編程方式更新約束?
- 25. 以編程方式實現約束
- 26. 以編程方式設置約束
- 27. 以編程方式和不帶尺寸類別的不同設備方向的各種自動佈局約束?
- 28. android編程中的約束佈局
- 29. 使用自動佈局以編程方式更改框架
- 30. 使用自動佈局以編程方式創建UIViewController
在10.10中,'NSLayoutConstraint'獲得了一個'active'屬性,可以設置爲false來禁用它。將其設置爲true可啓用它。 – 2014-09-24 17:52:28
@KenThomases我也看到了這個,但是當我將'active'設置爲'false'後,約束沒有被禁用。有沒有任何示例代碼?我試圖找到一些關於此的樣本或博客,我只是找不到任何。 – 2015-12-21 12:50:32