Xcode 以编程方式禁用自动布局约束
是否有任何编程方法临时禁用自动布局约束?在我再次需要该约束之前,我根本不希望在一段时间内考虑该约束。您使用Xcode 以编程方式禁用自动布局约束,xcode,swift,Xcode,Swift,是否有任何编程方法临时禁用自动布局约束?在我再次需要该约束之前,我根本不希望在一段时间内考虑该约束。您使用NSView的removeConstraint:;如果已在interface builder中创建约束,则可通过IBOutlet将其连接到代码 class MyView : NSView { @IBOutlet var temporaryConstraint : NSLayoutConstraint! var constraint : NSLayoutConstraint
NSView
的removeConstraint:
;如果已在interface builder中创建约束,则可通过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
}
}
行数更多,但可以说更容易理解,也不太粗俗。在为iOS 8.0或更高版本开发时,只需在创建IBOutlet后使用NSLayoutConstraint
的isActive
属性即可
更新
- 要根据下面的建议对门店进行有力的参考,请@rob mayoff感谢您
- 要使用.isActive而不是.active,请按照下面的建议使用Swift 4,谢谢@Mohit Singh
您的手机将具有以下插座:
@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
您可以访问willDisplayCell
中的约束,如下所示:
myCell.photoBottomConstraint.isActive = false
当您再次需要时:
myCell.photoBottomConstraint.isActive = true
根据oyalhi的回答,我还想指出,如果您想使其处于非活动状态,您必须对您的约束进行强有力的引用:
@IBOutlet var photoBottomConstraint: NSLayoutConstraint!
这不是显而易见的,但如果您使用的是弱引用,photoBottomConstraint
在此调用后可能为零:
myCell.photoBottomConstraint.active = false
因此,在将约束对象从视图中移除时,您只保留对约束对象的引用?有没有更干净的方法像一个启用了.property的属性那样做呢?呵呵,如果我显然没有选择的话,我会的。这似乎是应该已经存在的功能。您也可以尝试调整约束的活动优先级,但这可能不起作用。根据您正在执行的操作,您可能会转而查看NSViewAnimation,这通常是人们动态更改视图属性的方式。我尝试混淆优先级,但这会导致我正在执行的操作崩溃。我会试试你最初的建议。提醒你一句。我在使用active/deactive时不断出错,直到我更改了每个约束的优先级。在10.10中,NSLayoutConstraint
获得一个active
属性,该属性可以设置为false以禁用它。将其设置为true启用它。@Kenthomass我也看到了这一点,但在我将活动
设置为假
后,约束未被禁用。这有什么样的代码吗?我试图找到一些关于此的示例或博客,但找不到任何示例或博客。如果您想稍后重新激活约束,可能需要声明插座strong
(或者只需停止weak
,因为strong
是默认设置)。当约束被停用时,视图不再引用它,如果您在某个地方没有对它的强引用,它将被解除分配,并且弱
出口将设置为零。在Swift 4中活动
已重命名为isActive